Правильно ли добавлять к списку, перебирая его? - PullRequest
0 голосов
/ 17 октября 2018

Я вижу, что могу добавлять в список, перебирая его

lst = [1]
for i in lst:
    lst.append(i+1)
    print(i)

Могу ли я использовать это поведение?или это не рекомендуется?Я отмечаю, что то же самое нельзя сказать о set

lst = set([1])
for i in lst:
    lst.add(i+1)
    print(i)

Ошибка: размер изменился во время итерации.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

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

tasks = ['task1', 'task2']
for task in tasks:
    if task == 'task1':
        tasks.append('task1-retry')
    print(task)

Это выводит:

task1
task2
task1-retry

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

0 голосов
/ 17 октября 2018

Как уже говорили другие, вы создадите и бесконечный цикл.Но вы можете поймать это с помощью оператора break в python: https://docs.python.org/2.0/ref/break.html

Но опять же, если вы поймаете его с разрывом, вы можете переписать его в другой цикл, где он останавливается всякий раз, когда выполняется условие, которое вы используете дляоператор перерыва.

0 голосов
/ 17 октября 2018

Я думаю, что это не будет работать, потому что, если размер списка изменился, то (?) Элементы цикла также должны измениться, например, это может стать нарушением бесконечного цикла или нарушением доступа к памяти.Лучше сделай так:

list=[1,2,7,5]
list2=[]
for i in list:
  list2.append(i+1)
  print(i)
list=list+list2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...