2014-11-13 4 views
0

Я учусь Python, и во время физических упражнений, я попал в эту ситуацию:расширения списка, используя цикл

words = ['one', 'two', 'three'] 
for w in words 
    if len(w) == 5: 
     words.insert(0,w) 

Теперь, что произошло здесь в том, что в то время как петля итерации последнего слова и нашла совпадение, оно вставило новое слово в начале списка и продолжило цикл, когда длина списка увеличилась на 1. Это привело к бесконечному циклу.

Теперь я изменил код так:

words = ['one', 'two', 'three'] 
for w in words[:] 
    if len(w) == 5: 
     words.insert(0,w) 

Результат был точно так, как я ожидал. В начале было добавлено только одно слово, и он вышел из цикла.

Может кто-нибудь объяснить, что именно происходило в первом коде?

+1

Именно то, что вы уже сказали. –

+0

Главное отличие состоит в том, что слова будут ссылаться на ваш исходный список, тогда как слова [:] возвращают> новый <список, который вы перебираете. Это означает, что вы не будете редактировать тот же список, который вы повторяете. – Dyrborg

+0

Почему бы не сделать копию 'words' и сделать вставку под петлю? манипулирование списком в цикле, как правило, плохая идея. – Anzel

ответ

2

Вы перечислили список, который вы модифицировали в цикле. Плохая идея в большинстве случаев.

Возможно, вам не хватает того, что words[:] создает копию words. Вы перебираете копию, поэтому, когда вы добавляете в исходный список, все в порядке.

+0

Ну, я предполагаю, что, исходя из C фона, в первом случае, для каждой итерации (адрес первого элемента) + (счетчик итераций), и поскольку в начале добавлен элемент, он всегда выбирает последний элемент и продолжается в бесконечном цикле. –

+0

@SunilReddy Под капотом существует цикл 'for (int i = 0; i freakish

+0

Большое спасибо. Я буду спать спокойно ... –

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