首页 > 解决方案 > 在条件字典理解中找不到类范围内的变量

问题描述

考虑以下代码:

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工作。为什么?

标签: python-3.xscopepython-3.7

解决方案


在@tmadam指出的问题中,有一个非常好的和非常详细的答案

简短的回答是:

类范围内的名称不可访问。名称在最里面的封闭函数范围内解析。如果类定义出现在嵌套范围链中,则解析过程会跳过类定义。

至于解决方案,我相信达到预期结果的最简单方法是在__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'}

推荐阅读