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控制台,它应该可以正常工作。这是否回答了您的问题@谢谢,那当然是!