Ваша проблема, как представляется, для меня неясным. Но если мы говорим о вредоносном изменении списка во время итерации цикла for
в Python. Я могу думать о двух сценариях.
Первый, Вы изменяете некоторые элементы в списке, которые предположительно будут использоваться в следующем раунде вычисления в качестве исходного значения.
например. Вы хотите написать программу с такими входами и выходами, как эти.
Вход:
[1, 2, 3, 4]
Ожидаемый результат:
[1, 3, 6, 10] #[1, 1 + 2, 1 + 2 + 3, 1 + 2 + 3 + 4]
Но ...Вы пишете код таким образом:
#!/usr/bin/env python
mylist = [1, 2, 3, 4]
for idx, n in enumerate(mylist):
mylist[idx] = sum(mylist[:idx + 1])
print mylist
Результат:
[1, 3, 7, 15] # undesired result
Второй, вы внести некоторые изменения на размер списка во время итерации for
цикла.
например. От python-delete-all-entries-of-a-value-in-list:
>>> s=[1,4,1,4,1,4,1,1,0,1]
>>> for i in s:
... if i ==1: s.remove(i)
...
>>> s
[4, 4, 4, 0, 1]
Пример показывает нежелательный результат, который повышен с побочным эффектом изменения размера в списке. Это, очевидно, показывает вам, что каждый цикл в Python не может обрабатывать список с динамическим размером соответствующим образом. Ниже я покажу вам некоторые простой способ преодолеть эту проблему:
#!/usr/bin/env python
s=[1, 4, 1, 4, 1, 4, 1, 1, 0, 1]
list_size=len(s)
i=0
while i!=list_size:
if s[i]==1:
del s[i]
list_size=len(s)
else:
i=i + 1
print s
Результат:
[4, 4, 4, 0]
Заключение: Это, безусловно, не вреден для изменения каких-либо элементов в списке во время итерации цикла, если вы не 1) внести изменения в размер списка 2) сделать некоторый побочный эффект вычислений по своему усмотрению.
Вы фактически не изменяете список в этом коде. 'theList [idx] .SetIt (False)' может изменить элемент списка, но он не коснется списка. Здесь вам не нужно перебирать индексы. – user2357112
Тем не менее, когда вы думаете, что вам нужно что-то изменить, итерации по нему, лучший способ действий - это, как правило, изменить ситуацию, поэтому вам не нужно это делать. Часто это путем вычисления модифицированной версии списка/set/whatever и последующей замены оригинала на новую версию. – user2357112
@ user2357112 да, это простой способ, но как насчет памяти? В моей текущей работе это не проблема, но как бы вы это сделали, если это была проблема? – Adrian