我认为函数的前两行也不例外,因为引用了“Test”和“test”。
正确的。它们指的是 class 属性var
,而不是您定义的全局属性。
分配了成员“var”,但“Test”和“test”是全局的,因为被引用以获取成员。
或者换一种说法,Test
并且test
可以在全局命名空间中Test.var
使用test.var
。
如果 中的值var
未更改sum()
,您将得到 0,因为它上面的行更改了Test
类属性而不是全局属性。print
在 sum 中添加一些s 并删除var += 1
def sum():
Test.var += 1
print Test.var
test.var += 1
print test.var
print var
sum()
...给出:
1
2
0
但是,当我尝试在 sum 函数中为 var 赋值时,我什至在该行之前就收到了错误:
>>> def sum():
... Test.var += 1
... print Test.var
... test.var += 1
... print test.var
... print var
... var += 1
... print var
...
>>> sum()
1
2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in sum
UnboundLocalError: local variable 'var' referenced before assignment
因为var
现在在 sum() 中分配了一个值,所以它被认为是本地的,但在该行之前没有定义。(这意味着 python 正在做一些“向前看”或检查variable scope
sum(),因为它在重新评估print var
之前引发了第一个错误。放置而不是引发相同的错误。)var
var = 50
var += 1
使用全局变量:
def sum():
Test.var += 1
print Test.var
test.var += 1
print test.var
global var #added the global keyword
print var
var += 1
print var
输出:
1
2
0 # notice that global var is still 0 because the above var+=1 are for Test.var
1
编辑:关于我提到的“向前看”行为。本来要发布一个关于它的问题,但在这个答案中已经很好地解释了:https ://stackoverflow.com/a/370380/1431750 (到Python 变量范围错误)