понимание списка Python VS для поведения - PullRequest
5 голосов
/ 03 мая 2011

РЕДАКТИРОВАТЬ: моя глупая логика опередила меня. Ничто не является просто возвращением от вызова понимания. Хорошо, я провожу некоторые тесты на python, и я столкнулся с небольшой разницей в порядке выполнения, что приводит меня к пониманию того, как это реализовано, но я хотел бы, чтобы вы, замечательные люди, выполнили его если я прав или есть что-то еще. Рассмотрим этот код:

>>> a = ["a","b","c","d","e"]
>>> def test(self,arg):
...     print "testing %s" %(arg)
...     a.pop()
... 
>>>[test(elem) for elem in a]
testing a
testing b
testing c
[None, None, None]
>>> a
['a', 'b']
#now we try another syntax
>>> a = ["a","b","c","d","e"]
>>> for elem in a:
...     print "elem is %s"%(elem)
...     test(elem)
... 
elem is a
testing a
elem is b
testing b
elem is c
testing c
>>> a
['a', 'b']
>>> 

Теперь это говорит мне о том, что for elem в a: получает следующий итеративный элемент, затем применяет тело, тогда как понимание каким-то образом вызывает функцию для каждого элемента списка, прежде чем фактически выполнить код в функции, поэтому изменяет список из функции (pop) приводит к] none, none, none]

Это правильно? что здесь происходит?

спасибо

Ответы [ 3 ]

4 голосов
/ 03 мая 2011

Ваша функция test не имеет оператора return, поэтому ее использование в понимании списка приводит к списку None с.Интерактивная подсказка Python выводит все, что возвращает последний оператор.

Пример:

>>> def noop(x): pass
... 
>>> [noop(i) for i in range(5)]
[None, None, None, None, None]

Так что на самом деле нет разницы в том, как работает понимание списка и цикл for в вашем вопросе.

1 голос
/ 03 мая 2011
>>> a = ["a","b","c","d","e"]
>>> i = iter(a)
>>> next(i)
'a'
>>> a.pop()
'e'
>>> next(i)
'b'
>>> a.pop()
'd'
>>> next(i)
'c'
>>> a.pop()
'c'
>>> next(i)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
0 голосов
/ 03 мая 2011

Дошло до "c", затем закончились элементы в списке. Поскольку test ничего не возвращает, вы получаете [None, None, None].

...