2024-09-28 19:01:39 发布
网友
当我跑的时候
def classMaker(x): class y(object): x=x return y Y = classMaker("value")
我得到以下错误
但是x="value"。发生什么事?在
x="value"
类范围内的名称查找很奇怪,并且与文档不完全一致。在
通常,与函数作用域不同,类作用域中的名称查找都是相同的,不管作用域是否对名称赋值;首先是局部变量,然后是全局变量,然后是内建函数。然而,类作用域中的非局部查找会受到该类作用域中赋值的影响。在
如果你像
def classMaker(x): class y(object): z=x # not x=x return y
Python发现名称x与一个非局部变量匹配,它使用LOAD_DEREF操作码访问该变量的闭包单元。但是,实际代码中对x的赋值:
x
LOAD_DEREF
导致Python使用LOAD_NAME,这是类作用域名称查找的常用操作码,它看不到闭包变量。在
LOAD_NAME
这是不平等的。你通过赋值来取消它的定义,并试图赋值给新的,未定义的变量。用另一个名字。在
def classMaker(z): class y(object): x=z return y Y = classMaker("value")
类范围内的名称查找很奇怪,并且与文档不完全一致。在
通常,与函数作用域不同,类作用域中的名称查找都是相同的,不管作用域是否对名称赋值;首先是局部变量,然后是全局变量,然后是内建函数。然而,类作用域中的非局部查找会受到该类作用域中赋值的影响。在
如果你像
Python发现名称
^{pr2}$x
与一个非局部变量匹配,它使用LOAD_DEREF
操作码访问该变量的闭包单元。但是,实际代码中对x
的赋值:导致Python使用
LOAD_NAME
,这是类作用域名称查找的常用操作码,它看不到闭包变量。在这是不平等的。你通过赋值来取消它的定义,并试图赋值给新的,未定义的变量。用另一个名字。在
相关问题 更多 >
编程相关推荐