我有关于数组替换的错误。
way=[[0]*4]*2
arri=[1]*4
for i in range(0,2):
arri[i]=0
way[i]=arri
print(way)
我以为是
[[0, 1, 1, 1], [0, 0, 0, 0]]
[[0, 1, 1, 1], [0, 0, 1, 1]]
将打印在控制台上,但实际上是:
[[0, 1, 1, 1], [0, 0, 0, 0]]
[[0, 0, 1, 1], [0, 0, 1, 1]]
这是在控制台上打印的。
当我将way[i]
修改为way[1]
时,
[[0, 0, 0, 0], [0, 1, 1, 1]]
[[0, 0, 0, 0], [0, 0, 1, 1]]
这印有。
我在这里缺少的是什么?
答案 0 :(得分:1)
因为way=[[0]*4]*2
为您提供了两个指向同一列表[0, 0, 0, 0]
的引用,这可以通过它们相同的ID来证明:
In [4]: way=[[0]*4]*2
In [5]: way
Out[5]: [[0, 0, 0, 0], [0, 0, 0, 0]]
In [6]: way[0][0] = 1
In [7]: way
Out[7]: [[1, 0, 0, 0], [1, 0, 0, 0]]
In [8]: id(way[0])
Out[8]: 39479992
In [9]: id(way[1])
Out[9]: 39479992
您可以使用list comprehension来创建way = [[0]*4 for i in range(2)]
您可能会问为什么[0]*4
会为您提供正常的[0, 0, 0, 0]
:
In [16]: way
Out[16]: [0, 0, 0, 0]
In [17]: way[0] = 1
In [18]: way
Out[18]: [1, 0, 0, 0] # not [1, 1, 1, 1]
那是因为0
是一个整数,它是一个不可变类型int
,而[0, 0, 0, 0]
是一个可变类型list
。您可以看到this link以获取更多信息。