【发布时间】:2018-04-23 17:46:44
【问题描述】:
在这里,我无法访问 Python 中的类变量 列表理解。
class Student:
max_year = 18
year_choice = [i for i in range(100) if i > max_year]
def __init__(self, name):
self.name = name
print (self.year_choice)
Student('Blah')
但它在 Python 2 中运行良好。
../workspace$ python student.py
[19, 20, 21, 22, 2.... 99]
但在 Python 3 中出现错误。
../workspace$ python student.py
File "student.py", line 18, in <listcomp>
year_choice = [i for i in range(100) if i > max_year]
NameError: name 'max_year' is not defined
从调试这个当我改变 下面的语句
[i for i in range(100) if i > max_year]
到这里
[i for i in range(max_year)] # don't look too much into it ;)
工作正常。 为什么我无法访问 if/else 列表理解中的类变量?
【问题讨论】:
-
好吧,这很奇怪。 ;) 此外,它与列表组合中的
if无关。这也不起作用:[max_year-i for i in range(max_year)] -
是来自@py_dude 答案,我们可以定义 self.max_year 它与该类的类和实例共享。不仅适用于这个例子。但是在这里我很想知道为什么我们不能访问 if/else 列表理解中的类变量?
-
好问题,但它仍然是重复的;-)
-
对于
range(max_year),它之所以有效,是因为range(max_year)在在为列表理解创建的范围之外进行评估,但if子句被评估在新范围内。 -
我在回答中添加了一些代码来说明 Antti Haapala 的解释。
标签: python python-3.x scope