运行此代码:
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
?
答案 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
。但通常最好避免首先需要这个。您希望将某种行为与某种状态结合起来,这正是对象的用途,因此您只需编写一个小类,只需将其实例化一次。