Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在理解中引用类变量时出错_Python_Class_Variables_Reference_Nameerror - Fatal编程技术网

Python 在理解中引用类变量时出错

Python 在理解中引用类变量时出错,python,class,variables,reference,nameerror,Python,Class,Variables,Reference,Nameerror,我得到NameError:name'ID'未定义当试图在dict理解中访问class变量时,例如在class a中。在没有理解的情况下引用时,它可以正常工作(请参见B类)。所以我的问题是,为什么它在类a中抛出NameError而在类B中却没有抛出NameError class A: ID = "This is class A." test = {str(i): ID for i in range(5)} class B: ID = "This is class B."

我得到
NameError:name'ID'未定义
当试图在dict理解中访问class变量时,例如在
class a
中。在没有理解的情况下引用时,它可以正常工作(请参见
B类
)。所以我的问题是,为什么它在类a中抛出NameError而在类B中却没有抛出NameError

class A:
    ID = "This is class A."

    test = {str(i): ID for i in range(5)}

class B:
    ID = "This is class B."

    test = f"{ID}"
关于Python中名称解析的说明:
exec()
eval()
的类定义块和参数是特殊的 在名称解析的上下文中。类定义是一个可执行文件 可以使用和定义名称的语句。这些参考文献遵循 名称解析的常规规则,但未绑定本地 在全局名称空间中查找变量。的命名空间 类定义成为类的属性字典。 类块中定义的名称范围仅限于类 块它不扩展到方法的代码块–这是 包括理解和生成器表达式,因为它们是 使用函数作用域实现。这意味着将执行以下操作: 失败。

您在类定义中声明了一个变量
ID
,使其成为
class
static
变量。因此它的范围仅限于类块,因此您无法在
理解
中访问它

你可以在

想想这些例子

示例#1:

class A:
    ID = "This is class A."
    print(ID)
class B:
    L = [ 1, 2, 3, 4, 5, 6, 7]
    print([i * 2 for i in L])
class C:
   L = [ 1, 2, 3, 4, 5, 6, 7]
   print([L[i] * 2 for i in range(7)])
现在,当您执行
>>A()
时,输出将是
这是类A
,这是完全正确的,因为变量
ID
的范围仅限于类
A


示例#2:

class A:
    ID = "This is class A."
    print(ID)
class B:
    L = [ 1, 2, 3, 4, 5, 6, 7]
    print([i * 2 for i in L])
class C:
   L = [ 1, 2, 3, 4, 5, 6, 7]
   print([L[i] * 2 for i in range(7)])
现在,当您执行
>>B()
时,输出将是
[2,4,6,8,10,12,14]
,这是完全正确的,因为列表
L
的范围仅限于类B


示例#3:

class A:
    ID = "This is class A."
    print(ID)
class B:
    L = [ 1, 2, 3, 4, 5, 6, 7]
    print([i * 2 for i in L])
class C:
   L = [ 1, 2, 3, 4, 5, 6, 7]
   print([L[i] * 2 for i in range(7)])

现在执行
>>C()
将引发
名称错误
,说明名称
L
未定义。

您的问题不太清楚。你能解释一下什么是
ID
?您的
class B
如何工作?ID只是一个字符串,用作该类的标识符。我想在同一个类中的dict理解中使用ID class变量,但这会引发NameError。在B类没有理解力的情况下,它是有效的。所以我的问题是,为什么它在类a中抛出NameError而在类B中没有抛出NameError?你能发布完整的代码吗?您使用它的方式可能有问题。如果您只需将
class A
中的两行复制到python控制台,它应该可以正常工作。这是否回答了您的问题@谢谢,那当然是!