python-3.x - 在条件字典理解中找不到类范围内的变量
问题描述
考虑以下代码:
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
工作。为什么?
解决方案
在@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'}
推荐阅读
- mysql - 检查与您的 mysql 服务器版本相对应的手册,以获取在 '( - 附近使用的正确语法
- sql - INSERT ALL with ID using DEFAULT ON NULL 失败 PK Constraint
- ios - 似乎无法创建 Xcode 扩展
- python - 如何修复 Python 中的“AffinityPropagation 对象不可调用”错误
- sql - ORA-00972: 创建别名时指定了超过 30 个字符的标识符
- reactjs - 有人可以打开仅适用于经过身份验证的用户的 React 组件吗
- x86 - 内存屏障的传递性/累积性属性是如何在微架构上实现的?
- selenium - 无法单击框架中的链接
- angular - 在 Angular 7 中初始化模板驱动表单
- php - PHP & WP:当从 DB 抛出错误时,尝试 catch 不起作用