给出以下代码:
U = [1,2,3]
def test():
# global U
u = U * 2
print(u)
# U = u
test()
print(U)
在此表格中,print(u)显示[1,2,3,1,2,3]。这意味着在函数中成功读取了“U”。
但如果我取消注释U = u行,那么我收到以下错误消息:
u = U * 2 UnboundLocalError: local variable 'U' referenced before assignment
我只能通过取消注释'全球U'线来修复。我不明白这一点。以前u = U * 2工作得很好。如果我取消注释下面的一行,为什么在u = U * 2时会出现错误?
编辑:我不认为这是重复的。我的问题是为什么我在未修改的行中看到错误。在我的真实代码中,'u = U * 2'和'U = u'之间大约有100行,我花了几个小时才意识到错误实际上是由'U = u'行引起的。答案 0 :(得分:1)
U = ...
创建一个本地变量U
。在它出现的函数中的哪个位置并不重要,在开始或结束时,Python在解析函数体时解析所有这些事情。在这种情况下,全局变量U
并没有关系,它正被函数体中出现的局部变量U
所遮蔽。因此问题归结为您在定义U * 2
之前尝试U
。除了U
之外,您可以调用该变量以获得相同的效果。
澄清:
u = U * 2
U = u
这并不意味着阅读全局U
,然后创建本地U
。按U = ...
在任何地方出现函数体,Python保留名称U
作为局部变量名。相同的名称不能模糊地引用全局变量,也不能引用本地变量的下一行。
当您还添加global U
时,您要为Python澄清本地函数范围中的名称U
始终引用全局变量U
。
如果省略U = ...
,那么在函数内部的任何地方都不会创建该名称的局部变量,并且Python在获取其时会从周围的范围中查找U
的值值。