python变量作用域LEGB规则

python变量作用域LEGB规则,python,Python,根据LEGB规则,我认为找到b,python将向上移动堆栈帧,并在封闭的作用域pass_a中找到b?请纠正我的理解。Thx.LEGB中的“Enclosing”范围指一个范围 在下面的示例中,b是一个可以在封闭范围内找到的名称: pass_a(2) raise: NameError: global name 'b' is not defined. 在您的示例中,b包含在(不同的)本地作用域中,而不是封闭的作用域中 请参阅。pass\u a没有包含fun,它只调用函数fun需要在pass_a中定义


根据LEGB规则,我认为找到b,python将向上移动堆栈帧,并在封闭的作用域pass_a中找到b?请纠正我的理解。Thx.

LEGB中的“Enclosing”范围指一个范围

在下面的示例中,
b
是一个可以在封闭范围内找到的名称:

pass_a(2) raise: NameError: global name 'b' is not defined.
在您的示例中,
b
包含在(不同的)本地作用域中,而不是封闭的作用域中


请参阅。

pass\u a
没有包含
fun
,它只调用函数
fun
需要在
pass_a
中定义才能被它所包围“我以为找到b,python会向上堆栈帧”-python永远不会向上堆栈帧来查找变量。@user2357112。@wim:好的,是的,从技术上讲,python会在堆栈中查找变量,最明显的是使用
super
,但是标准的LEGB范围优先级规则中不包括堆栈遍历。在OP的示例中,不是b由fun()括起,fun()由pass_a()括起吗?因此,b在pass_a()的封闭范围内,否?否,您所描述的是一个框架而不是范围。框架在运行时创建(函数调用),但范围在定义时确定(模块导入)。
pass_a(2) raise: NameError: global name 'b' is not defined.
def pass_a(b):
    def fun():
        print(b)
    fun()