Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dict子类中的Python类变量_Python_Class_Scope_Dictionary Comprehension - Fatal编程技术网

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原稿中的轻微缩进没有帮助。