Python 3,在分配之前引用的变量,但是已分配

时间:2017-04-09 18:50:53

标签: python

所以我编写了一个使用数据库的程序,这个数据库存储了一个字典。 要将字典存储在 .db 文件中,我使用pickle。

一切都很好,但在运行代码时会出现此错误消息。

line 23, in save_data
pickle.dump(database,datafile)
UnboundLocalError: local variable 'database' referenced before assignment

save_data()是一个保存文件的函数,但在发布代码之前我想发布整个部分。

if com == "agregar": # "com" stands for command
    print("Escribe el nombre y el dinero del sujeto en cuestion")
    tempname = str(input("Nombre: "))
    tempvalue = int(input("Dinero: "))
    load_data()
    print(database,"hey") #Print intended for debug
    if tempname in database:
        database[tempname] += tempvalue 
    else:
        database[tempname] = tempvalue
    save_data()

请原谅西班牙语,我正在为那些讲西班牙语的人写这段代码。

load_data()是不言自明的,它将数据文件加载到数据库变量

def load_data():
global database
with open(namedata, "rb") as datafile:
    try:
        database = pickle.load(datafile)
    except EOFError:
        database = {}

Save_data()

def save_data():
with open(namedata, "wb") as datafile:
    pickle.dump(database,datafile)
del database

所以你看到我在那里写的打算用于调试的打印?是的,那个。 代码运行时,打印出来

Escribe el nombre y el dinero del sujeto en cuestion
Nombre: Jon
Dinero: 1000
{} hey
Traceback (most recent call last):
File "ex33.py", line 97, in <module>
   main()
File "ex33.py", line 93, in main
   main2(tempcom)
File "ex33.py", line 63, in main2
   save_data()
File "ex33.py", line 23, in save_data
  pickle.dump(database,datafile)
UnboundLocalError: local variable 'database' referenced before assignment

所以这就是说数据库被声明所以可以打印(database = {}),但是在save_data()函数中是不是?即使这个变量是全局的? 另外,在实验中,我用它的内容替换了 save_data()函数

    if com == "agregar":
    print("Escribe el nombre y el dinero del sujeto en cuestion")
    tempname = str(input("Nombre: "))
    tempvalue = int(input("Dinero: "))
    load_data()
    print(database,"hey")
    if tempname in database:
        database[tempname] =  database[tempname] + tempvalue 
    else:
        database[tempname] = tempvalue
    with open(namedata, "wb") as datafile:
        pickle.dump(database,datafile)
    del database

发生这种情况:

Escribe el nombre y el dinero del sujeto en cuestion
Nombre: danny
Dinero: 1000
Traceback (most recent call last):
File "ex33.py", line 99, in <module> 
  main()
File "ex33.py", line 95, in main
  main2(tempcom)
File "ex33.py", line 58, in main2
  print(database,"hey")
UnboundLocalError: local variable 'database' referenced before assignment
打印(数据库,&#34;嘿&#34;)不能再打印了,但为什么呢? 还有其他函数使用save_data()和load_data(),这些函数正常工作,例如

    if com == "list":
    print('Elige un nombre o escribe "completa" para mostrarla entera')
    templistcom = str(input("> "))
    load_data()
    while templistcom not in database:
        if templistcom == "completa": return
        print("Esta entrada no existe")
        templistcom = str(input("> "))
    if templistcom == "completa":
        for key in database:
            print(key, ":" ,database[key])
    else:
        print(templistcom, ":", database[templistcom])
    save_data()
    =============================================================
ex33.py
File Created[REG]
Bienvenido
Selecciona un comando
['list', 'agregar', 'registro', 'salir']
Comando: list
Elige un nombre o escribe "completa" para mostrarla entera
> Ken
Esta entrada no existe
> complta
Esta entrada no existe
> completa
Quieres salir?
si / no
> si

如您所见,此代码执行数据库save_data,load_data,它确实启动了错误。我一直在寻找答案,但我找不到有效的答案,请帮忙。 如果我没有说清楚,我会尽力表达自己,毕竟英语不是我的本土语言。

0 个答案:

没有答案