Изменение элемента в одном списке изменяет несколько списков
У меня есть список 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]
четыре раза, давая результат, который вы ожидаете,