python - 为什么 Python 会在类属性定义中为条件列表推导引发 NameError?
问题描述
这有效:
class Foo:
ATTR_1 = [1, 2]
ATTR_2 = [i for i in ATTR_1]
def __init__(self):
print(Foo.ATTR_1, Foo.ATTR_2)
Foo()
它打印[1, 2] [1, 2]
。然而,在第三行的列表推导中添加一个条件会导致 Python 抛出一个NameError
:
class Foo:
ATTR_1 = [1, 2]
ATTR_2 = [i for i in ATTR_1 if len(ATTR_1) > 0]
def __init__(self):
print(Foo.ATTR_1, Foo.ATTR_2)
Foo()
追溯:
Traceback (most recent call last):
File "/path/to/tmp.py", line 1, in <module>
class Foo:
File "/path/to/tmp.py", line 3, in Foo
ATTR_2 = [i for i in ATTR_1 if len(ATTR_1) > 0]
File "/path/to/tmp.py", line 3, in <listcomp>
ATTR_2 = [i for i in ATTR_1 if len(ATTR_1) > 0]
NameError: name 'ATTR_1' is not defined
为什么会这样,我该如何解决?我正在使用 Python 3.6.4。
解决方案
推荐阅读
- c# - 如何查找给定本地 IP 地址的网络接口
- r - 如何根据唯一值的数量选择列?
- javascript - 如何防止电子表格中来自 Google Web App 表单的受访者之间的混合数据?
- datadog - DataDog 日志搜索空字符串方面
- javascript - ChartJS 将自定义工具提示添加到堆叠条形图
- vue.js - VueJS Route 组件在路由更改时清除递归 setTimeout()
- java - 大型数组的 Java 纯存在导致大量内存峰值
- view - 如何在 SAPUI5 中使用 js 实例化视图并将其添加到路由器
- .net - 我可以使用标准 xml 序列化将 Xml Root 的内容作为字符串获取吗?
- go - 如何使用反射在 Golang 中创建和设置原语