为什么python会为函数参数抛出名称错误?

时间:2018-03-11 05:46:53

标签: python python-2.7 class parameters python-2.x

当我跑步时

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"。发生了什么事?

2 个答案:

答案 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")
相关问题