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
,将其装入load
self.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