如何修复Python上的数组替换错误?

时间:2016-02-15 03:47:32

标签: python-3.x

我有关于数组替换的错误。

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]]

这印有。

我在这里缺少的是什么?

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以获取更多信息。