python 如何确定函数中的变量是局部变量还是非局部变量?

问题描述

运行此代码打印 2。

x = 2
def foo():
    print(x)
foo()

但是,当我尝试打印 x 时,运行此代码会返回 UnboundLocalVariable 异常。 (第 3 行)。

x = 2
def foo():
    print(x)
    x = 10
foo()

Python 是一种解释型语言,所以我不明白它是如何“知道”我将在第 5 行将 xa 值分配为局部变量的,当它在第 4 行给出错误时。是否有某种伪代码- 定义函数时编译?

解决方法

在python中,变量定义附加到它所在的范围。在这个例子中,x在编译foo时附加到foo的范围。 Python 在第 3 行为您提供了 UnboundLocalError,因为 x 已附加到 foo 的范围但尚未绑定。如果不存在全局 x,则可以看到相同的错误:

>>> def foo():
...     print(x)
...     x = 10
...
>>> foo()
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "<stdin>",line 2,in foo
UnboundLocalError: local variable 'x' referenced before assignment

进一步探索,我们可以看到,在逐行编译时(在函数外,在交互式REPL中),python无法提前查看是否会定义x

>>> print(x)
Traceback (most recent call last):
  File "<stdin>",in <module>
NameError: name 'x' is not defined

我们得到一个 NameErrorUnboundLocalErrorNameError 的子类,因为它表示相同的问题,只是提供了更有用的名称和消息。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...