当我跑步时
def classMaker(x):
class y(object):
x=x
return y
Y = classMaker("value")
我收到以下错误
Traceback (most recent call last):
File "bug.py", line 6, in <module>
classMaker("value")
File "bug.py", line 2, in classMaker
class y(object):
File "bug.py", line 3, in y
x=x
NameError: name 'x' is not defined
但x="value"
。发生了什么事?
答案 0 :(得分:1)
在类范围内进行名称查找很奇怪,与文档不一致。
通常,与函数作用域不同,无论作用域是否具有名称赋值,类作用域中的名称查找都是相同的。首先是locals,然后是globals,然后是builtins。但是,类范围中的非本地查找受该类范围中的赋值的影响。
如果您执行类似
的操作def classMaker(x):
class y(object):
z=x # not x=x
return y
Python看到名称x
与非本地变量匹配,它使用LOAD_DEREF
操作码访问该变量的闭包单元格。但是,在实际代码中分配给x
:
def classMaker(x):
class y(object):
x=x
return y
导致Python使用LOAD_NAME
,这是类范围名称查找的常用操作码,它没有看到闭包变量。
答案 1 :(得分:-1)
这不等于。你通过assigment取消它并试图分配给新的,未定义的变量。使用其他名称。
def classMaker(z):
class y(object):
x=z
return y
Y = classMaker("value")