Axi*_*oms 2 python debugging global-variables pandas
我遇到了一个问题,在2个不同的函数中修改了全局变量后,该变量没有被“记住”。该变量df应该是数据帧,在用户加载正确的文件之前,它不会指向任何内容。这类似于我拥有的东西(使用pandas和tkinter):
global df
class World:
def __init__(self, master):
df = None
....
def load(self):
....
df = pd.read_csv(filepath)
def save(self):
....
df = df.append(...)
Run Code Online (Sandbox Code Playgroud)
save()总是被称为load()。问题是,当我调用时save(),出现了“ df未定义” 的错误。我以为已df在中进行了初始分配init(),然后在中进行了“更新” load()?我在这里做错了什么?
您必须global在函数内部而不是外部使用关键字。df您在函数中定义的所有内容都是本地范围的。这是正确的方法——
df = pd.DataFrame() # No need to use global here
def __init__(self, master):
global df # declare here
df = None
....
def load(self):
global df # declare here
....
df = pd.read_csv(filepath)
def save(self):
global df # declare here
....
df = df.append(...)
Run Code Online (Sandbox Code Playgroud)
您必须global df 在需要修改全局变量的函数内使用。否则(如果要写入),您将在函数内部创建一个具有相同名称的局部范围的变量,并且您所做的更改不会反映到全局变量中。
p = "bla"
def func():
print("print from func:", p) # works, readonly access, prints global one
def func1():
try:
print("print from func:", p) # error, python does not know you mean the global one
p = 22 # because function overrides global with local name
except UnboundLocalError as unb:
print(unb)
def func2():
global p
p = "blubb" # modifies the global p
print(p)
func()
func1()
print(p)
func2()
print(p)
Run Code Online (Sandbox Code Playgroud)
输出:
bla # global
print from func: bla # readonly global
local variable 'p' referenced before assignment # same named local var confusion
bla # global
blubb # changed global
Run Code Online (Sandbox Code Playgroud)