Python全局变量-未定义?
我遇到了这样一个问题:一个全局变量在两个不同的函数中被修改后就不会被“记住”。变量Python全局变量-未定义?,python,pandas,debugging,global-variables,Python,Pandas,Debugging,Global Variables,我遇到了这样一个问题:一个全局变量在两个不同的函数中被修改后就不会被“记住”。变量df应该是一个数据帧,在用户加载到正确的文件之前,它不会指向任何东西。这与我所拥有的类似(使用pandas和tkinter): save()总是在load()之后调用。问题是,当我调用save()时,我得到一个错误,“df未定义。”我以为df在init()中得到了它的初始赋值,然后在load()中得到了“更新”?我做错了什么?您必须在函数内部而不是外部使用global关键字。您在函数中定义的所有df都是局部作用域。
df
应该是一个数据帧,在用户加载到正确的文件之前,它不会指向任何东西。这与我所拥有的类似(使用pandas
和tkinter
):
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(...)
您必须在需要修改全局变量的函数中使用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)
输出:
bla # global
print from func: bla # readonly global
local variable 'p' referenced before assignment # same named local var confusion
bla # global
blubb # changed global
哦,那我每次打电话都要申报吗?没有一种方法可以让它在一个类中被“普遍”记住?@Axioms如果你想让它对一个类中的所有函数都可用,你可以把它变成一个类变量。除此之外,除了在每个函数中编写它之外,没有什么可做的needed@Axioms我更喜欢不使用全局变量——我主要是将它们作为函数的参数提供,或者将它们作为类中的成员变量。因此,如果我在声明类(即类变量)之后立即设置x=“hello”
,那么x
会是“hello”
在该类的每个函数中?@Axioms将是一个“静态”类变量,它在该类的实例之间共享,一个改变它-所有都得到改变。除非你需要创建20个不同的世界,否则访问相同的df
我可能会在\uuuu init\uuuuuu(self,…)中使用self.df=None
,将其装入loadself.df=pd.read\u csv(…)
等。
bla # global
print from func: bla # readonly global
local variable 'p' referenced before assignment # same named local var confusion
bla # global
blubb # changed global