понимание списка python VS для поведения

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

>>> 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 в a: получает следующий итерируемый элемент, затем применяет тело, тогда как понимание каким-то образом вызывает функцию для каждого элемента списка перед фактическим выполнением кода в функции, поэтому изменение списка из функции (поп) ведет к ]none, none, none]

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

Благодарность


person cromestant    schedule 03.05.2011    source источник
comment
test() ничего не возвращает, поэтому возвращает None. (Кстати, вы должны удалить параметр self.)   -  person Sven Marnach    schedule 03.05.2011
comment
да, я просто играю, я хотел посмотреть, действительно ли они эквивалентны... но здесь что-то есть в порядке выполнения.   -  person cromestant    schedule 03.05.2011
comment
Изменение размера коллекции (добавление или удаление элементов) во время ее повторения является наказуемым деянием.   -  person    schedule 03.05.2011
comment
да конечно я не спорю   -  person cromestant    schedule 03.05.2011
comment
В этом случае forloop и понимание списка имеют одинаковый эффект? Они оба печатают тестирование a, тестирование b, тестирование c и a==['a','b'] впоследствии. В чем разница???   -  person Ishtar    schedule 03.05.2011


Ответы (2)


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

Пример:

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

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

person StackExchange saddens dancek    schedule 03.05.2011

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

person Andrea    schedule 03.05.2011