Изменение элемента в одном списке изменяет несколько списков

У меня есть список List say mysolution:

>>>mySolution
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> mySolution[0][0] = 1    
>>> mySolution
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

Предполагаемый выход:

[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

почему все 1-е элементы в моем списке списка меняются на 1? Я хотел бы только изменить первый элемент первого списка на 1.

Ответ 1

Важно то, как вы создали свой первоначальный список mysolution. Как кажется, он содержит в четыре раза тот же список, поэтому его изменение однажды изменит его во всех четырех местах.

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

mysolution = [[0] * 4 for i in range(4)]

Ответ 2

Вполне возможно, что вы создали такой список:

mySolution = [0]*4
mySolution = [mySolution]*4

Или эквивалентно:

mySolution = [[0]*4]*4

Любой из вышеперечисленных фрагментов создаст список с четырьмя подсписками, которые являются копиями точного, такого же подсписка, поэтому любые изменения в одной подсписке будут отражаться на других - они одно и то же. Решение состоит в том, чтобы создать четыре разных подсписок:

mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Или немного короче:

mySolution = [[0]*4 for _ in xrange(4)]

Ответ 3

Потому что все содержащиеся списки на самом деле являются одним и тем же списком. Когда вы выполните:

l = [0, 0, 0, 0]
my_solution = [l, l, l]

Затем my_solution[0], my_solution[1] и my_solution[2] являются ссылками на один и тот же объект (l).

Если вы изменяете список в одном месте, он меняется везде. Это потому, что списки являются изменяемыми объектами.

Вместо этого используйте несколько списков:

l1 = [0, 0, 0, 0]
l2 = [0, 0, 0, 0]
l3 = [0, 0, 0, 0]
my_solution = [l1, l2, l3]

Что будет работать по назначению.

Ответ 4

обратите внимание, что все в порядке:

mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
mySolution[0][0] = 1    
print mySolution

>>> 
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

все зависит от того, как вы инициализировали свое solution. это

mySolution = [[0, 0, 0, 0]]*4
mySolution[0][0] = 1    
print mySolution

дает

>>> 
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
>>> 

потому что здесь каждый массив [0, 0, 0, 0] в mySolution является копией массива инициализации [0, 0, 0, 0] в [[0, 0, 0, 0]]*4. если вы измените первый элемент первого массива, его также измените.

с этой инициализацией mySolution = [[0, 0, 0, 0] for x in range(4)] вы не копируете массив, а [0,0,0,0] четыре раза, давая результат, который вы ожидаете,