#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]
.