Список изменений, которые вы просматриваете в этом цикле - PullRequest
0 голосов
/ 08 февраля 2019

В моем случае у меня есть цикл for, проходящий по списку, но я хочу изменить этот список в указанном цикле.После этого я хочу, чтобы цикл for перебирал новый список.

li = [4,5,6,7,8,9]
for item in li:
    #do something

    if item == 5:
        #now continue iterating through this loop and not the old one
        li = [9,9,9,9,9,9] 

Как мне сделать что-то подобное?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вы не должны изменять список путем итерации.Я бы использовал индексацию:

for i in range(len(li)):
    if li[i] == 5:
        li = len(li) * [9]
0 голосов
/ 08 февраля 2019

Чтобы понять, почему это не работает, цикл for эквивалентен циклу while, например:

# for x in y:
#    ...
itr = iter(y)
while True:
    try:
        x = next(itr)
    except StopIteration:
        break
    ...

Если вы назначите что-то новое для y, цикл будетне влияет, потому что он использует итератор только для исходного значения, присвоенного y, а не для самого имени y.

Однако, если вы do измените список вВ теле цикла итератор может вернуть значение, которое вы не ожидаете.Если вам нужно изменить итерацию, лучше всего получить итератор самостоятельно.

li = [4,5,6,7,8,9]
itr = iter(li)
while True:
    try:
        item = next(itr)
    except StopIteration:
        break
    #do something

    if item == 5:
        #now continue iterating through this loop and not the old one
        itr = iter([9,9,9,9,9])
0 голосов
/ 08 февраля 2019

Несмотря на то, что комментарий @ BoarGules верен, вы можете решить свою проблему, используя перечисление.

li = [4,5,6,7,8,9]
for i, item in enumerate(li):
    print(li[i])
    if li[i] == 5:
        li = [9,9,9,9,9,9]

Это выводит:

>4
>5
>9
>9
>9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...