据我所知,由于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循环,将z
复制到temp
,以不同的方式更改它,并将其推送到队列中。为了实现这一点,z
必须始终包含基础数组,因此我需要更改temp
不会更改z
。
编辑:我尝试将z更改为元组,以便z=z,
,然后调用z[0]
而不是z
。这仍然无法解决我的问题。
答案 0 :(得分:7)
复制列表很简单......只需将其切片:
temp = z[:]
这将创建一个浅层副本 - 列表中元素的突变将显示在z
中的元素中,但不会直接更改为temp
。
为了更一般的目的,python有一个copy
模块可以使用:
temp = copy.copy(z)
或者,可能:
temp = copy.deepcopy(z)
答案 1 :(得分:4)
为什么不让temp
成为z
的副本:
>>> z = [1, 2]
>>> temp = z[:]
>>> temp[1] = 3
>>> z
[1, 2]
>>> temp
[1, 3]
>>>
[:]
可以轻松制作列表的浅表副本。
但是,您可能也对copy.copy
和copy.deepcopy
感兴趣,这两者都来自Python的copy
模块。