SUBHRA Jatua Ответов: 3

Почему эта программа на Python не дает желаемого результата?


This question already has answers here:
Modifying list while iterating [duplicate] (7 answers)
Strange result when removing item from a list while iterating over it (3 answers)
Your post has been associated with similar questions. If these questions don’t resolve your question, ask a new one.

Closed 11 hours ago.

(Private feedback for you)

I have started learning Python. So I tried to run the following program:

nom = [1, 2, 3, 4, 5, 6]
for x in nom:
    print(nom)
    nom.pop(1)
print(nom)
I expected to get 1 printed at the end , but what I got is:

[1, 2, 3, 4, 5, 6]
[1, 3, 4, 5, 6]
[1, 4, 5, 6]
[1, 5, 6]
As the loop seems interrupted in midway. Why is that? please explain

What I have tried:

<pre>As the loop seems interrupted in midway. Why is that? please explain

3 Ответов

Рейтинг:
28

OriginalGriff

Копирование вопроса из Stack overflow и надежда, что мы решим его для вас, когда то, что вы публикуете, говорит: "у него уже есть ответ", - это не очень хорошая идея.

Перейдите по некоторым ссылкам, которые дал вам оригинальный комментарий SO, и посмотрите, что они описывают, вместо того чтобы ожидать, что другие сайты подберут его для вас.

Подсказка: не меняйте коллекцию, пока вы перебираете ее: это имеет странные или раздражающие эффекты, точно так же, как попытка подсчитать смешанные монеты, когда кто-то другой добавляет и удаляет пригоршни наугад.


CPallini

5.

SUBHRA Jatua

@originalgriff Да, я скопировал этот вопрос из stack overflow, и это был мой вопрос там. Но ответ в StackOverflow тогда не прояснил моего замешательства. поэтому я начал искать подобные сайты и нашел Codeproject. Я здесь новичок, но ни копирование не сделает меня богаче, ни небольшое объяснение не сделает вас беднее.

И большое вам спасибо за подсказку, я ее понял.

OriginalGriff

Пожалуйста.

SUBHRA Jatua

Я сожалею о своем предыдущем высокомерном ответе. Спасибо за вашу быструю помощь.

OriginalGriff

Никаких проблем!

Рейтинг:
19

CPallini

Потому что, как наш OriginalGriff как уже отмечалось, вы изменяете коллекцию, повторяя ее.

именно

for x in nom:
работает, если количество элементов nom ничего не меняется.

Рабочей альтернативой может быть
nom = [1, 2, 3, 4, 5, 6]
while len(nom) > 1 :
    print(nom)
    nom.pop(1)

print(nom)


SUBHRA Jatua

Большое спасибо

CPallini

Добро пожаловать.

Рейтинг:
12

Richard MacCutchan

В качестве альтернативы превосходному ответу CPallini вы можете попробовать использовать неглубокую копию списка:

nom = [1, 2, 3, 4, 5, 6]
for x in nom[:-1]: # this avoids a pop error after the last item.
    print(nom)
    nom.pop(1)
print(nom)


Все это, а также многое другое, объясняется в Учебник по Python — документация по Python 3.7.9[^]


CPallini

Ух ты, что-то новенькое узнал сегодня!
Мой 5.

Richard MacCutchan

Спасибо, Карло. Не так уж часто я тебя чему-то учу. :)

SUBHRA Jatua

Спасибо Вам за вашу помощь