Вопрос-Ответ

Can't modify list elements in a loop [duplicate]

Не удается изменять элементы списка в цикле

Во время выполнения цикла над списком в 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 in range(len(li)):
i = li[idx]
i = 'foo'

Поэтому, если вы назначите что-либо i, это не повлияет li[idx].

Решение заключается либо в том, что вы предложили, либо в циклическом просмотре индексов:

for idx in range(len(li)):
li[idx] = 'foo'

или используйте enumerate:

for idx, item in enumerate(li):
li[idx] = 'foo'
Ответ 2

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

В любом случае, когда вы это делаете, for i in li вы получаете копию каждого значения li переменной in i, вы не получаете ссылку на позицию в li, поэтому вы не изменяете какое-либо значение в li.

Если вы хотите изменить свой список, вы можете сделать это с помощью enumerate:

>>> li = ["spam", "eggs"]
>>> for i,_ in enumerate(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 in enumerate(lst):
lst[i] = 0 // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Ответ 4

for element in li - возвращает вам копию элемента, а не сам элемент.

Решением для вашего случая было бы:

for i in range(len(li)):
li[i] = 'foo'
2023-04-25 08:11 python list