JOHN_16
Разъясните топикстартеру и всем остальным почему это так и должно быть
python.org. 2. namingThis means that the following will fail:
class A:
a = 42
b = list(a + i for i in range(10))
Во втором питоне
>>> class A:
... a = 42
... b = list(a + i for i in range(10))
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in A
File "<stdin>", line 3, in <genexpr>
NameError: global name 'a' is not defined
>>>
Во втором питоне заменяем только list() на квадратные скобки
>>> class A:
... a = 42
... b = [a + i for i in range(10)]
...
>>>
Должен выдавать исключение, как написано в документации, но не выдаёт.
Хотя да, в документации честно написано, что это только к генераторным выражениям относится. (Списочные включения не являются генераторными выражениями.)
Rodegast
Нет. Скорее всего в третьем питоне баг, а во втором питоне фича.
Не, скорее было так: они сделали только для генераторных выражений, а потом это поняли и добавили списочные включения.
Вот это прослеживается:
Как во втором было только про генераторные выражения
The scope of names defined in a class block is limited to the class block; it does not extend to the code blocks of methods – this includes generator expressions since they are implemented using a function scope.
А в третьем добавили к генераторным выражениям все включения
The scope of names defined in a class block is limited to the class block; it does not extend to the code blocks of methods – this includes comprehensions and generator expressions since they are implemented using a function scope.