类条件范围内的变量在条件字典理解中找不到[重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

请考虑以下代码:

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.x scope python-3.7
1个回答
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'}
© www.soinside.com 2019 - 2024. All rights reserved.