python如何更改嵌套列表中的元素

python如何更改嵌套列表中的元素,python,nested-lists,Python,Nested Lists,我已经使用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 com

我已经使用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]...]
为什么它不附加?(我想要一个理论解释) 我怎样才能得到想要的结果

谢谢

编辑: 以另一种方式开始列表,我得到了期望的结果

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

但是我仍然想知道为什么第一个版本不起作用,我如何初始化一个包含很多元素的列表?

您在这里有一个相同的
[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

啊,你赢了我!不过,我想我们应该在成千上万的重复中找到一个。我正在练习快速打字。投票结果很接近,所以我以前的代码等于s=[0,0]l=[s*10],所以我总是使用相同的指针?@Donbeo完全正确,是的。是的,与
s=[0,0]相同;l=[s,s,s,s,s,s,s,s,s,s]