【发布时间】:2016-11-26 19:09:52
【问题描述】:
a = 10
def f():
print(1)
print(a) # UnboundLocalError raised here
a = 20
f()
这段代码当然会引发UnboundLocalError: local variable 'a' referenced before assignment。但是为什么在print(a) 行会引发这个异常呢?
如果解释器逐行执行代码(就像我想的那样),当到达print(a) 时它不会知道有什么问题;它只会认为a 引用了全局变量。
因此,解释器似乎提前读取了整个函数,以确定a 是否用于赋值。这在任何地方都有记录吗?解释器是否还有其他情况需要提前查看(除了检查语法错误)?
为了澄清,异常本身非常清楚:全局变量可以在没有 global 声明的情况下读取,但不能写入(这种设计可以防止由于无意修改全局变量而导致的错误;这些错误特别难以调试,因为它们会导致发生在远离错误代码位置的错误)。我只是好奇为什么会提前引发异常。
【问题讨论】:
-
我想你会发现python默认不能从函数内部访问全局变量。您必须明确声明您的意思是使用全局变量。 (顺便说一句,不要使用全局变量)。
-
@quamrana 不真实。如果您删除对本地
a的分配,代码将打印10。 -
对于它的价值,这不是特定于 python 3,只是在 python 2 中测试并且发生了同样的事情。
-
我想你会发现 python 不能 (edit)
accesswrite to 来自内部函数的全局变量默认。您必须明确声明您的意思是使用全局变量。 (顺便说一句,不要使用全局变量)。 -
像this这样的类似/重复有很多,但由于这个Q没有冗余代码,我认为它不应该被关闭。
标签: python function python-3.x scope