Python全局变量 - 未定义?

时间:2018-04-08 08:15:36

标签: python pandas debugging global-variables

我遇到了一个全局变量不被记住的问题"在它被修改为2个不同的功能之后。变量df应该是一个数据框,并且在用户加载到正确的文件中之前它并不指向任何内容。这类似于我所拥有的(使用pandastkinter):

global df

class World:

    def __init__(self, master):
        df = None
        ....

    def load(self):
        ....
        df = pd.read_csv(filepath)

    def save(self):
        ....
        df = df.append(...)
始终在save()之后调用{p> load()。事情是,当我致电save()时,我收到的错误是" df未定义。"我认为dfinit()获得了初始分配,然后更新了#34;在load()?我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

哟必须使用<{1}} 里面需要修改全局变量的函数。否则(如果写入),您将在函数内创建一个同名的本地范围变量,并且您的更改不会反映到全局变量。

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)

答案 1 :(得分:3)

您必须在函数内部而不是在外部使用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(...)