关于函数:Python的变量范围的意外行为

Unexpected behavior of Python's variable scope

本问题已经有最佳答案,请猛点这里访问。

对于Python的变量范围系统是如何工作的,我有点困惑。假设我遇到这样的情况:

1
2
3
a = 10
def test():
    print(a)

然后一切都如我所料。python首先查找局部变量a,找不到它,然后搜索全局变量。

但是,在这种情况下:

1
2
3
4
5
a = 10
def test():
    print(a)
    a += 1
    print(a)

python抛出了一个未绑定的本地错误异常,显然是源于第3行(print(a))。在我看来,至少在这一行没有任何变化,我不明白为什么会有例外。


由于python没有变量声明,因此函数范围内的每个变量分配都被视为局部变量。因此,必须始终指定该变量是全局变量:

1
2
3
4
5
6
7
a = 10
def test():
    global a
    print(a)
    a += 1
    print(a)
test()


这是因为当您对一个(应该是全局的)进行一些操作时,Python将其视为本地的。

所以当你做一个+=1的时候,它会搜索局部变量,但它找不到任何变量,因此产生了错误。

如果您试图增加全局A,那么您需要在前面提到一个带有全局关键字的。否则使用其他变量并递增

您还可以查看:unboundLocalError:在赋值python之前引用的局部变量"l"

考虑这个

1
2
3
4
5
6
7
c = 0

def increment():
  print c
  c += 1

increment()

如果函数中有一个变量的赋值,则该变量被视为局部变量,因此,行

1
c += 1

将计数器隐式设为increment()的本地计数器。所以print c将搜索局部变量c而不是全局变量c希望现在没问题