Вот что вы можете наблюдать:
>>> from threading import Thread
>>> from time import sleep
>>> liszt = ['first item', 'second item', 'third item', 'fourth item',
... 'plentee more items', "but I'm lazy"]
>>> def thread_one():
... for i in liszt:
... print 'Thread one found "%s"' % i
... sleep(1)
...
>>> def thread_two():
... sleep(0.5)
... print 'Thread two deleting first item.'
... del liszt[0]
... sleep(1)
... print 'Thread two deleting fourth item.'
... del liszt[3]
...
>>> Thread(target=thread_one).start(); Thread(target=thread_two).start()
Thread one found "first item"
Thread two deleting first item.
Thread one found "third item"
Thread two deleting fourth item.
Thread one found "fourth item"
Thread one found "but I'm lazy"
Отсюда видно, что изменение списка в одном потоке повлияло на итератор в другом потоке; удаление первого элемента заставило итератор пропустить элемент, удаление будущего элемента означает, что его не будет видно в итераторе, потому что он пропал.
Вот модель того, как это работает; Я не предоставляю код для этого явно, но вы можете решить это из наблюдения.
State: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Iterator position: ^
Перейти к следующему пункту.
State: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Iterator position: ^
Удалить первый элемент.
State: [2, 3, 4, 5, 6, 7, 8, 9, 10]
Iterator position: ^
Перейти к следующему пункту.
State: [2, 3, 4, 5, 6, 7, 8, 9, 10]
Iterator position: ^
Удалить пятый элемент.
State: [2, 3, 4, 5, 7, 8, 9, 10]
Iterator position: ^
и так далее. Что касается потоков, то не имеет значения, делаете ли вы это в одном или нескольких потоках. Конечно, у вас может быть условие гонки, независимо от того, удален элемент или нет, но он все равно работает аналогичным образом.
Если вы не знакомы с внутренностями итерации, встречайте iter
. for x in y
итерирует по iter(y)
, на самом деле. Таким образом, вы можете поиграть с объектом iter(liszt)
listiterator, если хотите, используя next()
, пока вы играете со списком, над которым он итерирует. Удобнее, чем цикл for в интерактивной консоли Python.