понимание списка python в сравнении с поведением

#python #list-comprehension

#python #понимание списка

Вопрос:

РЕДАКТИРОВАТЬ: моя глупая логика меня опередила. None — это просто результаты вызова понимания. Хорошо, я запускаю некоторые тесты на 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 в a: получает следующий повторяющийся элемент, затем применяет тело, тогда как понимание каким-то образом вызывает функцию для каждого элемента списка перед фактическим выполнением кода в функции, поэтому изменение списка из функции (pop) приводит к ]none, none, none]

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

Спасибо

Комментарии:

1. test() ничего не возвращает, следовательно, оно возвращает None . (Кстати, вам следует удалить self параметр.)

2. да, я просто играю, я хотел посмотреть, действительно ли они эквивалентны… но здесь есть что-то в порядке выполнения.

3. Изменение размера коллекции (добавление или удаление элементов) во время итерации по ней является наказуемым преступлением.

4. да, конечно, я не обсуждаю это

5. Forloop и понимание списка имеют одинаковый эффект в этом случае? Они оба печатают «тестирование a, тестирование b, тестирование c» и a==['a','b'] после этого. В чем разница???

Ответ №1:

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

Пример:

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

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

Ответ №2:

 >>> 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
>>>
  

Ответ №3:

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