当后面的if子句存在时,python中的全局变量不会被引用

当后面的if子句存在时,python中的全局变量不会被引用,python,global-variables,Python,Global Variables,我试图理解以下代码失败的原因,即无法识别全局变量: 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 "globa

我试图理解以下代码失败的原因,即无法识别全局变量:

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
$python3 globals-test2.py
4.
回溯(最近一次呼叫最后一次):
文件“globals-test2.py”,第12行,在
()
文件“globals-test2.py”,第10行,在
b()
文件“globals-test2.py”,第4行,在b中
打印(xy)
UnboundLocalError:赋值前引用的局部变量“xy”
为什么函数b中不识别全局xy

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


谢谢。

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

global xy

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

因为您在函数中使用它,所以通过在函数顶部添加
global xy
来声明它为全局变量

xy=4
def b():
全局xy
打印(xy)
如果xy为无:
xy=2
定义a():
打印(xy)
b()
()

这是Python中众所周知的一个问题。在函数中指定给的任何变量都是整个函数的局部变量。如果你想要外部xy,你必须说

全局xy

在函数中


注意,“分配给”,我的字面意思是
xy=
。如果您编写
xy[0]=value
xy.foo=value
,那么
xy
仍然可以是一个全局变量,而不声明它是全局变量。

这个问题已经回答了很多次。您可以转到搜索栏并粘贴错误“UnboundLocalError:赋值前引用的局部变量'xy',如果链接的副本不够,则可以获得许多高质量的答案。我知道我可以在b()中声明全局变量;但令人惊讶的是,当函数b()中的if子句不存在时,xy被认为是全局的;但是当if子句出现时,xy被认为是本地的;我理解if条款中的分配是造成差异的原因。令人惊讶的是,当函数b()中的if子句不存在时,xy被认为是全局的;但是当if子句存在时,xy被认为是局部的。重要的是
xy=..
出现在函数的某个地方。它是否被实际执行并不重要。