python 中的全局变量在稍后出现 if 子句时未被引用

Global variables in python not referenced when later if clause is present

我试图理解为什么以下代码失败,无法识别全局变量:

xy = 4

def b():
        print(xy)
        if xy is None:
                xy = 2

def a():
        print(xy)
        b()

a()

当运行时,我得到输出:

$ python3 globals-test2.py 
4
Traceback (most recent call last):
  File "globals-test2.py", line 12, in <module>
    a()
  File "globals-test2.py", line 10, in a
    b()
  File "globals-test2.py", line 4, in b
    print(xy)
UnboundLocalError: local variable 'xy' referenced before assignment

为什么函数 b 无法识别全局 xy?

删除函数 b 中的 if 子句会使错误消失。

谢谢。

您的代码存在的问题是该变量不是全局变量。如果你想在这些函数中使用它们,你必须将它们作为参数传递或在函数类型的开头传递

global xy

这将使函数中的变量成为全局变量

由于您在函数中使用它,因此通过在函数顶部添加 global xy 将其声明为全局变量。

xy = 4

def b():
  global xy
  print(xy)
  if xy is None:
    xy = 2

def a():
  print(xy)
  b()

a()

这是 Python 中的一个 well-known 问题。在函数中赋值的任何变量对于整个函数都是局部的。如果你想要外面的xy,你必须说

global xy

在函数中。

请注意,“分配给”是指 xy = <value>。如果你写 xy[0] = valuexy.foo = value,那么 xy 仍然可以是一个全局变量而不用声明它。