非局部变量

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

(请注意,使用生成器可以更好地实现此处提供的功能。)