【问题标题】:Why does python throw a name-error for function parameters? [duplicate]为什么python会为函数参数抛出名称错误? [复制]
【发布时间】:2018-08-19 09:37:40
【问题描述】:

当我跑步时

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"。怎么回事?

【问题讨论】:

  • 这是一个完全相同的副本,在上面的答案中进行了很好的讨论。
  • 那个副本有很多令人沮丧的细微差别;例如,问题中的编辑 5 认为类范围根本无法从封闭函数范围访问变量。

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


【解决方案1】:

不相等。您通过分配取消声明它并尝试分配给新的未定义变量。使用其他名称。

def classMaker(z):
    class y(object):
        x=z
    return y

Y = classMaker("value")

【讨论】:

  • 为什么我们不能使用 x=x 你能在功能上解释一下我们可以正确使用它为什么不在这里???
【解决方案2】:

在类范围内查找名称很奇怪,并且与其文档并不完全一致。

通常,与函数作用域不同,在类作用域中进行名称查找的过程是相同的,无论作用域是否对名称进行了赋值;首先是本地,然后是全局,然后是内置。但是,类作用域中的非本地查找该类作用域中的赋值影响。

如果你这样做

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,这是类范围名称查找的常用操作码,它看不到闭包变量。

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多