Scenerio:
for i in range(6):
for j in range(i):
j
AFAIK, в понимании списка наиболее подходящим является for
, поэтому я подумал, что будет работать следующий код:
[ j for j in range(i) for i in range(6)]
Но, к моему удивлению, он выдает NameError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'i' is not defined
Интересно, почему это не сработало.Это потому, что python вычисляет выражение от Слева направо ?Потому что я решил проблему, используя круглые скобки:
[ (j for j in range(i)) for i in range(6)]
, которая выводит кучу выражений генератора:
[<generator object <listcomp>.<genexpr> at 0x7f3b42200d00>, <generator object <listcomp>.<genexpr> at 0x7f3b42200d58>, <generator object <listcomp>.<genexpr> at 0x7f3b42200db0>, <generator object <listcomp>.<genexpr> at 0x7f3b42200e08>, <generator object <listcomp>.<genexpr> at 0x7f3b42200e60>, <generator object <listcomp>.<genexpr> at 0x7f3b42200eb8>]
Чтобы исследовать, что находится внутри этих выражений генератора, мы можем просто привести ихв списки, то есть
[ list(j for j in range(i )) for i in range(6)]
и вывод такой, как ожидалось:
[[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
Я просто хочу знать, что здесь на самом деле происходит.