为什么这个Python代码会出现名称错误?

时间:2015-07-19 08:07:29

标签: python class nameerror

我希望拥有一个由类的所有实例共享并可访问的属性。

示例代码:

class Test:

    code = [ 1, 2, 3, 5, 6, 7, 8, 9, 10]
    code2d = [ [ code[j*3 + i] for i in range(3) ] for j in range(3) ]

    def __init__(self):
        pass

然而,我收到错误:

  

NameError:未定义名称“代码”

如果我将带有codecode2d的行放入init方法,那么一切都正常。

为什么此代码会抛出错误?

1 个答案:

答案 0 :(得分:2)

code是一个类变量,因此在访问它时您需要调用 - Test.code,您无法使用code访问它们。

此外,即使您使用Test.code访问它们,它仍然无效,因为在定义类时会计算类变量的值(默认值),因此当您尝试访问{时{1}},您将无法访问Test.code,因为它尚未创建。例子 -

Test

我猜你何时把它们放在>>> class Test: ... code = [ 1, 2, 3, 5, 6, 7, 8, 9, 10] ... code2d = [ [ Test.code[j*3 + i] for i in range(3) ] for j in range(3) ] ... def __init__(self): ... pass ... Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in Test File "<stdin>", line 3, in <listcomp> File "<stdin>", line 3, in <listcomp> NameError: name 'Test' is not defined 你把它们作为 -

课程测试:

__init__()

这样可行,因为def __init__(self): code = [ 1, 2, 3, 5, 6, 7, 8, 9, 10] code2d = [ [ code[j*3 + i] for i in range(3) ] for j in range(3) ] 这里是code,因此可以通过local variable方法中的其他局部变量加入,但在此函数之外无法访问它们。

也许,如果你想为类的所有实例(类的对象)提供__init__()code,那么你不需要它们作为类变量,你应该创建实例变量as-

code2d

如果您真的希望>>> class Test: ... def __init__(self): ... self.code = [ 1, 2, 3, 5, 6, 7, 8, 9, 10] ... self.code2d = [ [ self.code[j*3 + i] for i in range(3) ] for j in range(3) ] code成为类变量,那么一种方法是在类code2d之外定义code2d,例如 -

Test