在条件dict理解中找不到类范围内的变量

时间:2019-02-20 14:31:27

标签: python-3.x scope python-3.7

考虑以下代码:

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有效。为什么?

1 个答案:

答案 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'}