考虑以下代码:
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
有效。为什么?
答案 0 :(得分:3)
在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'}