非局部变量
Python 3.x >= 3.0
Python 3 添加了一个名为 nonlocal 的新关键字。nonlocal 关键字将范围覆盖添加到内部范围。你可以在 PEP 3104 中阅读所有相关内容。最好用几个代码示例来说明这一点。最常见的一个例子是创建可以递增的函数:
def counter():
num = 0
def incrementer():
num += 1
return num
return incrementer
如果你尝试运行此代码,你将收到 **UnboundLocalError,**因为 num 变量在最内层函数中分配之前被引用。让我们添加非本地组合:
def counter():
num = 0
def incrementer():
nonlocal num
num += 1
return num
return incrementer
c = counter()
c() # = 1
c() # = 2
c() # = 3
基本上 nonlocal
将允许你分配外部范围中的变量,但不能分配给全局范围。因此,你不能在我们的 counter
函数中使用 nonlocal
,因为它会尝试分配到全局范围。尝试一下,你会很快得到一个 SyntaxError
。相反,你必须在嵌套函数中使用 nonlocal
。
(请注意,使用生成器可以更好地实现此处提供的功能。)