使用list.reverse()在复制品上会改变原始列表

2024-04-18 19:00:24 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在试着做一个检查回文的函数,我想我可以很容易地使用list.reverse()函数,但是奇怪的事情发生了,我想知道为什么。这是我的代码:

x = list('hey')
x
['h', 'e', 'y']
y = x
y
['h', 'e', 'y']
y.reverse()
y
['y', 'e', 'h']
x
['y', 'e', 'h']

我的问题是,为什么当我反转列表y时,它也会反转列表x?在


Tags: 函数代码列表事情listreversehey
3条回答

按值而不是引用复制x

x = list('hey')
x
['h', 'e', 'y']
y = list(x)
y
['h', 'e', 'y']
y.reverse()
y
['y', 'e', 'h']
x
['h', 'e', 'y']

正如Vivek所说,y指向与x相同的位置。要解决此问题,请使用copy模块中的deepcopy

import copy
x = list('hey')
y = copy.deepcopy(x)

这将确保它们指向不同的位置并且是独立的。在

对于那些认为deepcopy是个坏主意的人,我不得不强烈反对——考虑以下代码:

^{pr2}$

输出为:

[[45, 54], 56]
[[1, 54], 56]

因为浅拷贝在可能的情况下返回对列表元素的引用。我只是想教给操作人员一个通用的方法来创建一个完全独立的拷贝—不管他们试图复制的对象是什么类型。在

即使是自引用对象也由deepcopy处理:

>>> a = [2]
>>> a.append(a)
>>> a
[2, [...]]
>>> import copy
>>> b = copy.deepcopy(a)
>>> b
[2, [...]]

x和{}是指相同的内存位置。在

>>> x = [1,2,3]
>>> id(x)
141910924
>>> y = x
>>> id(y)
141910924
>>> z = list(x)
>>> id(z)
141676844
>>> x.append(10)
>>> x
[1, 2, 3, 10]
>>> y
[1, 2, 3, 10]
>>> z
[1, 2, 3]

当我们想将列表值赋给其他变量时,请使用copy和deepcopy e、 g

^{pr2}$

相关问题 更多 >