Изменить значение текущего итерированного элемента в списке

проблема: когда вы используете конструкцию

for a in _list_:
    print a

он печатает каждый элемент в массиве. Но вы не можете изменить массив. Можно ли изменить значение массива (что-то вроде a = 123, но это не работает) Я знаю, что это возможно (например, во время цикла), но я хочу сделать это таким образом (более элегантный)

В PHP это будет похоже на

foreach ($array as &$value) {
    $value = 123;
}

(из-за знака &, передается как ссылка)

Ответ 1

for idx, a in enumerate(foo):
    foo[idx] = a + 42

Обратите внимание, что если вы это делаете, вам, вероятно, следует изучить список (или map), если вы действительно не хотите мутировать на месте (просто не вставляйте и не удаляйте элементы из списка с повторением).

Тот же цикл, написанный как понимание списка, выглядит так:

foo = [a + 42 for a in foo]

Ответ 2

Поскольку итераторы python - это всего лишь "ярлык" для объекта в памяти, установка его приведет к простому указанию на что-то еще.

Если итератор является изменяемым объектом (список, set, dict и т.д.), вы можете изменить его и увидеть результат в том же самом объекте.

>>> a = [[1,2,3], [4,5,6]]
>>> for i in a:
...    i.append(10)
>>> a
[[1, 2, 3, 10], [4, 5, 6, 10]]

Если вы хотите установить каждое значение, например, 123, вы можете либо использовать индекс списка, либо получить доступ к нему, либо использовать список > :

>>> a = [1,2,3,4,5]
>>> a = [123 for i in a]
>>> a
[123, 123, 123, 123, 123]

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