有一段代码:
x = 1
def A():
global x
print(x + 1)
def B():
nonlocal x
print(x + 2)
B()
A()
def C():
global x
return x + 1
给出以下错误:
File "main.py", line 6
nonlocal x
^
SyntaxError: no binding for nonlocal 'x' found
问题: 是什么原因导致此错误以及如何修复它?
PS给出的“程序”是一个大大简化的真实代码。我提前警告你:该程序需要这样的架构,而且正是这样的架构。事实是,变量x可能很大(1+ MB),并且函数可以被调用数百万次,因此在调用函数时B()不能传递它- 程序会严重冻结。xB()
nonlocal产生错误,因为指令本身搜索非局部变量,不包括全局变量。正确示例:在您的情况下,
x它是一个全局变量,不符合指令的定义。Python 中有一个叫做作用域的东西。其运行原理在官方文档的LEGB 规则中规定。
让我们从简单的事情开始。本地.
此范围对于表示(函数或类)来说是本地的。例如
终端输出:
全球的
如果一个变量是在函数外部声明的并且单独存在,那么它是全局的。要使用其上下文,您需要使用
global. 这是一个我们重新分配全局变量的示例。非本地的
如果我们需要使用嵌套函数从父视图请求变量的上下文,那么我们使用
nonlocal. 例如,让我们创建一个父函数并在其中嵌套另一个函数,从父函数调用一个变量并通过添加 10 来更改它。然后尝试全局调用它。终端输出:
结论
在您的情况下,您正在使用全局变量
x,因此您需要使用指令来获取全局变量global: