为什么python对函数参数抛出nameerror?

2024-09-28 19:01:39 发布

您现在位置:Python中文网/ 问答频道 /正文

当我跑的时候

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

Y = classMaker("value")

我得到以下错误

^{pr2}$

但是x="value"。发生什么事?在


Tags: returnobjectvaluedef错误classpr2classmaker
2条回答

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

通常,与函数作用域不同,类作用域中的名称查找都是相同的,不管作用域是否对名称赋值;首先是局部变量,然后是全局变量,然后是内建函数。然而,类作用域中的非局部查找会受到该类作用域中赋值的影响。在

如果你像

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

Python发现名称x与一个非局部变量匹配,它使用LOAD_DEREF操作码访问该变量的闭包单元。但是,实际代码中对x的赋值:

^{pr2}$

导致Python使用LOAD_NAME,这是类作用域名称查找的常用操作码,它看不到闭包变量。在

这是不平等的。你通过赋值来取消它的定义,并试图赋值给新的,未定义的变量。用另一个名字。在

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

Y = classMaker("value")

相关问题 更多 >