Во время выполнения цикла над списком в Python я не смог изменить элементы без понимания списка. Для справки:
li = ["spam", "eggs"] for i in li: i = "foo"
li ["spam", "eggs"]
li = ["foo"for i in li] li ["foo", "foo"]
Итак, почему я не могу изменять элементы через цикл в Python? Определенно чего-то мне не хватает, но я не знаю чего. Я уверен, что это дубликат, но я не смог найти вопрос по этому поводу, и если есть ссылка, этого было бы более чем достаточно.
Переведено автоматически
Ответ 1
Потому что способ for i in li работает примерно так:
for idx inrange(len(li)): i = li[idx] i = 'foo'
Поэтому, если вы назначите что-либо i, это не повлияет li[idx].
Решение заключается либо в том, что вы предложили, либо в циклическом просмотре индексов:
for idx inrange(len(li)): li[idx] = 'foo'
или используйте enumerate:
for idx, item inenumerate(li): li[idx] = 'foo'
Ответ 2
На самом деле при понимании списка вы не изменяете список, вы создаете новый список, а затем присваиваете его переменной, которая содержала предыдущий.
В любом случае, когда вы это делаете, for i in li вы получаете копию каждого значения li переменной in i, вы не получаете ссылку на позицию в li, поэтому вы не изменяете какое-либо значение в li.
Если вы хотите изменить свой список, вы можете сделать это с помощью enumerate:
>>> li = ["spam", "eggs"] >>> for i,_ inenumerate(li): li[i] = "foo" >>> li ['foo', 'foo']
или с помощью xrange (в Python 2.7 используйте range в python 3):
>>> for i in xrange(len(li)): li[i] = "foo" >>> li ['foo', 'foo']
или с пониманием списка, которое вы показали в своем вопросе.
Ответ 3
Я могу изменять список во время цикла:
lst = range(10) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for i, elem inenumerate(lst): lst[i] = 0 // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Ответ 4
for element in li - возвращает вам копию элемента, а не сам элемент.