给定以下代码:
U = [1,2,3]
def test():
# global U
u = U * 2
print(u)
# U = u
test()
print(U)
在此表单中,打印(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"one_answers"u=u"之间大约有100行,我花了几个小时才意识到错误实际上是由"u=u"行引起的。
U = ...
创建一个局部变量U
。无论它出现在函数的哪里,无论是在开始还是结束,Python在解析函数体时都会解决所有这些问题。在这种情况下,也有全局变量U
并不重要,它被函数体中出现的局部变量U
遮蔽。因此,问题归结为在定义U
之前尝试执行U * 2
。为了获得相同的效果,您可以调用除U
之外的任何其他变量。
澄清:
u = U * 2
U = u
这并不意味着读取全局U
,然后创建本地U
U = ...
出现在函数体内的任何位置,Python将名称U
保留为局部变量名。同一名称不能含糊地引用全局变量,也不能在下一行中含糊地引用局部变量。
当您还添加global U
时,您为Python澄清了本地函数范围中的名称U
总是指全局变量U
。
如果省略U = ...
,那么函数内的任何位置都不会创建该名称的局部变量,Python在获取其值时会从周围的范围中查找U
的值。