2

我知道,由于 Python 的工作方式,x = []; y = x; x.append(1); y将打印[1]. 然而,反过来说,

z = [1,2]
temp = z
temp[1] = 3
z,temp

将打印([1,3],[1,3])。如果我理解正确,两者都z指向temp同一个列表,所以改变一个会改变另一个,因为列表是可变的。我怎样才能防止这种情况发生?也就是说,我想制作一个 for 循环,它将复制ztemp,以不同的方式更改它,并将其推送到队列中。为此,z必须始终包含基本数组,因此我需要更改temp不会更改z

编辑:我尝试将 z 更改为元组,以便z=z,,然后调用z[0]而不是z. 这仍然不能解决我的问题。

4

2 回答 2

10

复制列表很容易......只需将其切片:

temp = z[:]

这将创建一个浅拷贝——列表中元素的突变将显示在中的元素中z,但不会直接更改为temp


对于更一般的用途,python 有一个copy可以使用的模块:

temp = copy.copy(z)

或者,可能:

temp = copy.deepcopy(z)
于 2013-10-10T15:43:27.743 回答
5

为什么不复制temp_z

>>> z = [1, 2]
>>> temp = z[:]
>>> temp[1] = 3
>>> z
[1, 2]
>>> temp
[1, 3]
>>>

[:]轻松制作列表的浅表副本。

但是,您可能也对copy.copyand感兴趣copy.deepcopy,这两者都来自 Python 的copy模块。

于 2013-10-10T15:43:41.270 回答