dict子类中的Python类变量
考虑一下这个代码dict子类中的Python类变量,python,class,scope,dictionary-comprehension,Python,Class,Scope,Dictionary Comprehension,考虑一下这个代码 A类: B类: foo=1 bar={x:B表示范围(5)内的x} 这将产生一个错误,说明未定义B。但是,当在REPL上的相应行使用调试器停止时,我可以很好地运行该代码。这似乎是一些嵌套/范围问题,但我不理解 有人能解释一下发生了什么以及如何解决这个问题吗?dict理解隐含地定义了一个匿名函数。在该函数体中,B是一个自由变量。变量查找规则声明B的值取自定义B的最近封闭范围,但是class语句没有定义范围(尽管它定义了一个类似于适当范围的临时命名空间)。匿名函数本地作用域的下一
A类:
B类:
foo=1
bar={x:B表示范围(5)内的x}
这将产生一个错误,说明未定义B
。但是,当在REPL上的相应行使用调试器停止时,我可以很好地运行该代码。这似乎是一些嵌套/范围问题,但我不理解
有人能解释一下发生了什么以及如何解决这个问题吗?dict理解隐含地定义了一个匿名函数。在该函数体中,
B
是一个自由变量。变量查找规则声明B
的值取自定义B
的最近封闭范围,但是class
语句没有定义范围(尽管它定义了一个类似于适当范围的临时命名空间)。匿名函数本地作用域的下一个作用域是全局作用域,其中未定义B
为避免绑定问题,请定义一个以B
为参数的函数,并让该函数执行dict:
bar = (lambda cls: {x: cls for x in range(5)})(B)
现在,可以在类
语句的当前名称空间中找到B
is(避免了作用域规则),并且在lambda表达式定义的匿名函数范围中定义的cls
现在可以在dict使用的范围堆栈中找到。换句话说,理解函数创建的匿名函数是lambda表达式函数作用域上的闭包
也就是说,嵌套类在Python中并不常见;您可以在全局范围内定义
B
,以解决本例中的问题。dict理解隐式定义匿名函数。在该函数体中,B
是一个自由变量。变量查找规则声明B
的值取自定义B
的最近封闭范围,但是class
语句没有定义范围(尽管它定义了一个类似于适当范围的临时命名空间)。匿名函数本地作用域的下一个作用域是全局作用域,其中未定义B
为避免绑定问题,请定义一个以B
为参数的函数,并让该函数执行dict:
bar = (lambda cls: {x: cls for x in range(5)})(B)
现在,可以在类
语句的当前名称空间中找到B
is(避免了作用域规则),并且在lambda表达式定义的匿名函数范围中定义的cls
现在可以在dict使用的范围堆栈中找到。换句话说,理解函数创建的匿名函数是lambda表达式函数作用域上的闭包
也就是说,嵌套类在Python中并不常见;您可以在全局范围内定义
B
,以解决本例中的问题。@MadPhysical原稿中的轻微缩进没有帮助。@MadPhysical原稿中的轻微缩进没有帮助。