举个栗子:
>>> x = 10>>> def bar():… print(x)>>> bar()10作品,但这个代码:
>>>>>> x = 10>>> def foo():… print(x)… x += 1导致UnboundLocalError:
>>>>>> foo()Traceback (most recent call last): …UnboundLocalError: local variable ‘x’ referenced before assignment这是因为,当您对作用域中的变量进行赋值时,该变量将变为该作用域的局部变量,并在外部作用域中对任何具有相似名称的变量进行遮蔽。由于foo中的最后一个语句赋予一个新值 ,因此编译器将其识别为局部变量。因此,当早期尝试打印未初始化的局部变量并产生错误时。
在上面的例子中,你可以通过声明它是全局的来访问外部范围变量:
>>>>>> x = 10>>> def foobar():… global x… print(x)… x += 1>>> foobar()10这个显式声明是为了提醒你(不同于类和实例变量的表面上类似的情况),你实际上是在修改外部变量的值:
>>>>>> print(x)11您可以使用 关键字在嵌套范围内做类似的事情:
>>>>>> def foo():… x = 10… def bar():… nonlocal x… print(x)… x += 1… bar()… print(x)>>> foo()1011