2013-09-22 3 views
6

У меня есть список Список сказать 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.

+4

О, это надоедливый оператор 'n * list'! Я честно не возражаю, если бы он исключил, когда были обнаружены изменяемые типы. – user2246674

ответ

8

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

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

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

mySolution = [0] * 4 mySolution = [mySolution] * 4 – Pavan

+1

@Pavan: Это не сработает, потому что это тот же список четыре раза , poke's aviods, что. – flornquake

2

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

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

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

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

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

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

, который будет работать как задумано.

2

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

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

Или что то же самое:

mySolution = [[0]*4]*4 

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

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

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

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

обратите внимание, что это делает хорошо:

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] четыре раза, давая результат, который вы ожидаете.

Смежные вопросы