python本地范围

时间:2013-02-15 05:43:34

标签: python local

运行此代码:

import re
regex = re.compile("hello")
number = 0
def test():
  if regex.match("hello"):
    number += 1

test()

产生此错误:

Traceback (most recent call last):
  File "test.py", line 12, in <module>
    test()
  File "test.py", line 10, in test
    number += 1
UnboundLocalError: local variable 'number' referenced before assignment

为什么我可以从函数内部引用regex,而不是number

1 个答案:

答案 0 :(得分:2)

因为你在函数中定义了一个名为number的新变量。

以下是您的代码有效执行的操作:

def test():
    if regex.match("hello"):
        number = number + 1

当Python首次编译此函数时,只要它看到number =,就会使number成为本地函数。对该函数内的number的任何引用,,无论它出现在哪里,都将引用新的本地。全球化是阴影。因此,当函数实际执行并且您尝试计算number + 1时,Python会查询 local number,但尚未为其分配值。

这完全是由于Python没有变量声明:因为你没有明确地声明本地,所以它们都是隐式声明在函数的 top

在这种情况下,您可以使用global number(在它自己的行上)告诉Python您总是想要引用全局number。但通常最好避免首先需要这个。您希望将某种行为与某种状态结合起来,这正是对象的用途,因此您只需编写一个小类,只需将其实例化一次。