请考虑以下代码:
class A:
ID = 5
VALUES = ((4, "four"), (5, "five"))
MAP = {
t[0]: t[1] for t in VALUES if t[0] != ID
}
这是令人惊讶的(对我而言),因为找到了VALUES
符号,但是代码给出了错误“NameError:全局名称'ID'未定义”。
只有t[0]: t[1] for t in VALUES
工作。为什么?
excellent and very detailed answer指出的问题中有一个@t.m.adam。
简短的回答是:
无法访问类范围中的名称。名称在最里面的封闭函数范围内解析。如果类定义出现在嵌套作用域链中,则解析过程将跳过类定义。
至于解决方案,我认为实现所需结果的最简单方法是在__init__
函数中创建变量,如下所示:
class A:
ID = 5
VALUES = ((4, "four"), (5, "five"))
def __init__(self):
self.MAP = {
t[0]: t[1] for t in self.VALUES if t[0] != self.ID
}
如果您打印self.MAP
的结果,您将获得以下内容:
>>> my_instance = A()
>>> print(my_instance.MAP)
{4: 'four'}