2016-01-10 1 views
4

В этом post могут использоваться следующие фрагменты кода.Разница между 'для [-1] в' и 'для a в a' в Python?

a = [0, 1, 2, 3] 
for a[-1] in a: 
    print(a[-1]) 

Обратитесь к этому answer

Делая for a[-1] in a, вы на самом деле итерацию по списку и временного хранения значение текущего элемента в a[-1].

Кроме того, я думаю, что делать for a in a, он должен перебирать список и временного хранения значение текущего элемента a, поэтому значение a может быть 0, а не итератора, то TypeError будет сгенерировано исключение в следующей итерации. Однако результат следующий.

>>> a = [0, 1, 2, 3] 
>>> for a in a: 
...  print a 
... 
0 
1 
2 
3 
>>> a 
3 

Как это понять?

ответ

3

Цитируя official documentation on for loop,

Итератор создан для результата expression_list. Затем пакет выполняется один раз для каждого элемента, предоставленного итератором, в порядке возрастания индексов.

Итак, когда вы итерируете объект, создается объект итератора и используется для итерации. Поэтому исходный объект не теряется, по крайней мере, до тех пор, пока цикл не будет запущен.

В вашем случае, когда выполняется for a in a:, сначала создается объект итератора для a, а значения извлекаются из объекта итератора. Несмотря на то, что цикл связывает имя a с некоторым другим значением на каждой итерации, объект-итератор все еще содержит ссылку на исходный объект списка и выдает значения из него. Вот почему вы не получаете никаких ошибок.

+0

Итак, 'a [-1]' может изменить «объект итератора»? – zangw

+0

@zangw Он не изменяет объект итератора, он фактически изменяет значение в объекте списка. Когда итератор достигает последнего элемента, он просто возвращает все, что есть в последней позиции списка. – thefourtheye

+0

, так как «итерационный объект» создается в 'for' iteration,' a [-1] 'изменить исходный объект, но' for a in a: 'просто изменить« объект итератора »? – zangw

Смежные вопросы