Python 全局变量 - 未定义?

新手上路,请多包涵

我遇到了一个问题,即全局变量在 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() 总是在 load() 之后调用。问题是,当我调用 save() 时,我收到错误消息“ df 未定义。”我以为 df 得到了初始分配,然后在 init() load() 了“更新”?我在这里做错了什么?

原文由 Axioms 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 833
2 个回答

您必须在需要修改全局变量的函数 内部 使用 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

原文由 Patrick Artner 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于使用 python3 来到这里的任何人 - 尝试使用 nonlocal 而不是 global - python3 中引入的新结构允许您在本地范围内改变和读取全局变量

原文由 raGhavSri 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题