Создание бесконечного цикла for - PullRequest
1 голос
/ 23 апреля 2019

Я хотел проверить, позволит ли Python запустить этот код:

listWords = []
for i in range (len(listWords)+1):
    listWords.append("New word")
print ("End loop")

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

Почему python НЕ обновляет диапазон цикла for, когда я добавляю новый элемент в список?

Есть ли способ обойти это использование цикла for? (Я подозреваю, что цикл while подойдет для моего случая, но мне просто любопытно)

Спасибо

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Перебор списка, который вы одновременно обновляете, является плохой практикой.

В вашем коде диапазон уже вычислен до запуска цикла, поэтому диапазон будет range(1), а затем дляцикл запускается только один раз и останавливается.Это также можно наблюдать, если listWords не пусто, а равно listWords = ['a','b'], поэтому цикл запускается 3 раза, поскольку итератор равен range(3)

Тогда код становится равным.

listWords = ['a','b']
for i in range (len(listWords)+1):
    listWords.append("New word")
print ("End loop")
print(listWords)
['a', 'b', 'New word', 'New word', 'New word']

Хотя цикл не имеет такого ограничения, приведенный ниже пример будет продолжать работать, поскольку len (listWords) всегда обновляется в конце следующей итерации

listWords = []
i = 0
while i <  (len(listWords)+1):
    listWords.append("New word")
    i+=1
1 голос
/ 23 апреля 2019

Как уже отмечалось, обновление списка при его повторении обычно плохая идея . Однако, похоже, что в этом случае это именно то, что вы хотите сделать. Вместо вычисления len списка до итерации списка (именно поэтому он никогда не обновляется), вы можете итерировать элементы в списке напрямую.

>>> lst = [1,2,3]
>>> for x in lst:
...     if x < 10:
...         lst.append(x*2)
...         
>>> lst
[1, 2, 3, 2, 4, 6, 4, 8, 12, 8, 16, 16]

Если вам нужен индекс текущего элемента (или и индекс, и сам элемент), вы можете использовать for i, x in enumerate(lst) для того же эффекта.

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