Python的变量范围的意外行为

时间:2015-05-29 06:37:45

标签: python function variables scope

我对Python的变量范围系统如何工作有点困惑。说我有这样的情况:

a = 10
def test():
    print(a)

然后一切都按照我的预期运作。 Python首先查找局部变量a,找不到它然后搜索全局变量。

然而,在这种情况下:

a = 10
def test():
    print(a)
    a += 1
    print(a)

Python抛出一个UnboundLocalError异常,显然是源自第3行(print(a))。对我来说,似乎至少在这一行没有任何改变,我不明白为什么还有一个例外。

2 个答案:

答案 0 :(得分:0)

这是因为当你对a进行某些操作(预计是全局的)时,python会将其视为本地操作。

所以当你执行+ = 1时,它会搜索局部变量,但它找不到任何错误。

如果您尝试增加全局a,那么您需要在此之前提及一个全局关键字。否则使用其他一些变量并将其递增

您还可以查看:UnboundLocalError: local variable 'L' referenced before assignment Python

考虑一下

c = 0

def increment():
  print c
  c += 1

increment()

如果对函数内部的变量赋值,则该变量被视为局部因此,行

c += 1

隐式地使计数器本地为increment()。 因此print c将搜索局部变量c而不是全局变量c 我希望现在好了

答案 1 :(得分:0)

由于python没有变量声明,因此函数范围内的每个变量赋值都被认为是本地的。因此,您始终必须指定该变量是全局变量:

a = 10
def test():
    global a
    print(a)
    a += 1
    print(a)
test()