2014-02-19 3 views
1

Я много использую python, и сегодня меня удивляет простой вложенный список.python Как изменить элемент во вложенном списке

Как изменить значение элемента в моем списке?

>>> l=[[0,0]]*10 
>>> l 
[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] 
>>> l[0] 
[0, 0] 
>>> l[0][0] 
0 
>>> l[0][0]=1 #here comes the question 
>>> l 
[[1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0]] 
>>> 

Я бы ожидать, как конечный результат

l=[[1,0],[0,0],[0,0]...] 

Почему это не добавляет? (Я хотел бы получить теоретическое объяснение) Как я могу получить желаемый результат?

Спасибо.

EDIT: В запуске списка в другой, как я получить желаемый результат

>> l=[[0,0],[0,0]] 
>>> l 
[[0, 0], [0, 0]] 
>>> l[0][0]=1 
>>> l 
[[1, 0], [0, 0]] 
>>> 

, но я до сих пор удивляюсь, почему первая версия не работает и как я могу инициализировать список много элементов ?

ответ

5

У вас есть список из же[0, 0] элемента 10 раз здесь:

l=[[0,0]]*10 

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

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

l = [[0, 0] for _ in range(10)] 

Один простой способ проверить, будет печатать id друг, который является адресом памяти, где она хранится:

>>> for element in l: 
...  print id(element) 
... 
34669128 
34669128 
34669128 
34669128 
34669128 
34669128 
34669128 
34669128 
34669128 
34669128 
+0

Арг, ты избил меня! Я полагаю, что мы должны найти одну из тысяч обманов этого. –

+0

Я практикую скорость ввода текста. закрытое голосование было отлито – mhlester

+0

, поэтому мой предыдущий код был равен s = [0,0] l = [s * 10], и поэтому у меня всегда один и тот же указатель? – Donbeo

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