为什么你可以阅读但不能修改全球价值观?

时间:2012-02-25 19:13:59

标签: python

>>> import sys
>>> print(sys.version)
2.4.4
>>> b = 11
>>> def foo2():
...    a = b
...    print a, b
...
>>> foo2()
11 11
>>> def foo3():
...    a = b 
...    b = 12
...    print a, b
...
>>> foo3()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo3
UnboundLocalError: local variable 'b' referenced before assignment
>>> def foo4():
...    global b
...    a = b
...    b = 12
...    print a, b
...
>>> foo4()
11 12

问题&GT;在foo3中,为什么你可以访问全局变量而不声明它但你仍然无法修改它。

2 个答案:

答案 0 :(得分:4)

如果没有global声明,Python编译器会扫描每个函数的整个代码,以查看在函数代码中分配给的变量。在foo3()中,您分配给ab,因此它们都被视为函数中的局部变量。

当方法代码执行时,在您执行a = b时,b还没有值(因为您没有为其分配任何内容)。因此,您获得UnboundLocalError

这样做是为了在函数总是中使用变量引用相同的位置,即使尚未为其分配任何内容。

答案 1 :(得分:3)

意外地踩踏全局变量是错误的常见原因。因此,在修改变量global之前声明它是有意义的。

必须始终声明非局部变量global是一件痛苦的事。因此,如果你所做的只是阅读它,你就可以使用全局变量。但是,如果您要在函数中的任何位置修改x,则必须在使用它任何之前将其声明为全局。