Arrays 为什么嵌套数组会在python中复制其元素?

Arrays 为什么嵌套数组会在python中复制其元素?,arrays,python-3.x,Arrays,Python 3.x,看看这个代码 a=[[0]*3]*3 a[1][1]=1 for x in a: print(*x) #output # 0 1 0 # 0 1 0 # 0 1 0 a=[ [0,0,0], [0,0,0], [0,0,0] ] a[1][1]=1 for x in a: print(*x) #output # 0 0 0 # 0 1 0 # 0 0 0 看看这个代码 a=[[0]*3]*3 a[1][1]=1 for x in a: print(*x) #ou

看看这个代码

a=[[0]*3]*3
a[1][1]=1
for x in a:
    print(*x)

#output
# 0 1 0
# 0 1 0
# 0 1 0
a=[
[0,0,0],
[0,0,0],
[0,0,0]
]
a[1][1]=1
for x in a:
    print(*x)

#output
# 0 0 0
# 0 1 0
# 0 0 0
看看这个代码

a=[[0]*3]*3
a[1][1]=1
for x in a:
    print(*x)

#output
# 0 1 0
# 0 1 0
# 0 1 0
a=[
[0,0,0],
[0,0,0],
[0,0,0]
]
a[1][1]=1
for x in a:
    print(*x)

#output
# 0 0 0
# 0 1 0
# 0 0 0
我相信在这两种情况下,数组a是相同的。
但是为什么结果不同呢。

在第一个exmaple中,您创建了一个列表,然后复制了三次。因此,每个副本都指向原始列表,我们可以通过打印对象的id看到这一点

a=[[0]*3]*3
a[1][1]=1
对于a中的x:
打印(id(x))
#输出
2330620420744
2330620420744
2330620420744
在第二个示例中,您创建了3个单独的列表

a=[
[0,0,0],
[0,0,0],
[0,0,0]
]
a[1][1]=1
对于a中的x:
打印(id(x))
#输出
2330620420680
2330648632008
2330653113224
如果要创建这样的二维列表,可以使用范围函数创建x多个列表

a=[[0]表示范围内(3)]表示范围内(3)]
a[1][1]=1
对于a中的x:
打印(id(x))
#输出
2475065760136
2475067183944
2475067184328

这不一样,第一个示例是创建一个列表并复制三次。在第二个示例中,您创建了三个独立的lists@ChrisDoyle是的,但我只修改了第二个列表中的一个元素(在第一种情况下),它被应用到了所有列表中。我想知道为什么?是的,但是你在第一个案例中只有一个列表。这就像说
a=[1,2,3];b=a;b[0]=9
。在本例中,只有一个列表,a和B都指向同一个列表,因此更改B中的元素也会更改a中的元素,因为它们都指向同一个列表。在你的第一个例子中,你做了同样的事情。创建一个列表,然后制作指向该列表的3个副本。所以,如果你对其中任何一个副本进行更改,它都会反映在所有副本中,因为只有一个列表,它们都指向它,汉克斯,我现在知道了。