2016-10-08 2 views
4

Рассмотрим я вложен цикл в списке питон осмыслениюФорс в питона списке понимание

>>> data = [[0, 1, 2], [3, 4, 5], [6, 7, 8]] 
>>> [y for x in data for y in x] 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
>>> [y for y in x for x in data] 
[6, 6, 6, 7, 7, 7, 8, 8, 8] 

Я не могу объяснить, почему, что, когда я изменить порядок двух fors

for y in x 

Что x во втором понимании списка?

+0

Может быть, стоит отметить, что это расхождение не происходит в 'ipython' терминале, хотя. Любые идеи почему? – kmario23

ответ

6

Он сохраняет значение предыдущего comprehsension. Попробуйте переворачивая их, вы получите сообщение об ошибке

>>> data = [[0, 1, 2], [3, 4, 5], [6, 7, 8]] 
>>> [y for y in x for x in data] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'x' is not defined 

Для дальнейшей проверки его, печати x и посмотреть

>>> [y for x in data for y in x] 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
>>> x 
[6, 7, 8] 
>>> [y for y in x for x in data] 
[6, 6, 6, 7, 7, 7, 8, 8, 8] 
+0

OH, я вижу! '[y для y в x для x в данных]' Таким образом, вложенный 'x' не изменит значение внешнего' x', иначе, 'for x in data' не будет работать. Я прав? Но не будет ли результат «[6,7,8]»? – MMMMMCCLXXVII

+0

@MMMMMCCLXXVII Я не уверен, буду ли я следовать. Понимание списка не дает новой области. См. [This] (http://stackoverflow.com/questions/291978/short-description-of-python-scoping-rules). –

2

В списочных являются:

[y for x in data for y in x] 
[y for y in x for x in data] 

for петля конверсия [y for y in x for x in data]:

for y in x: 
    for x in data: 
     y 

Здесь x держит последнее обновленное значение x вашего предыдущего списка понимания, которое:

[6, 7, 8] 
Смежные вопросы