2024-04-18 19:00:24 发布
网友
嗨,我正在试着做一个检查回文的函数,我想我可以很容易地使用list.reverse()函数,但是奇怪的事情发生了,我想知道为什么。这是我的代码:
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?在
按值而不是引用复制x
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:
y
copy
deepcopy
import copy x = list('hey') y = copy.deepcopy(x)
这将确保它们指向不同的位置并且是独立的。在
对于那些认为deepcopy是个坏主意的人,我不得不强烈反对——考虑以下代码:
输出为:
[[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
按值而不是引用复制
x
正如Vivek所说,
y
指向与x
相同的位置。要解决此问题,请使用copy
模块中的deepcopy
:这将确保它们指向不同的位置并且是独立的。在
对于那些认为
^{pr2}$deepcopy
是个坏主意的人,我不得不强烈反对——考虑以下代码:输出为:
因为浅拷贝在可能的情况下返回对列表元素的引用。我只是想教给操作人员一个通用的方法来创建一个完全独立的拷贝—不管他们试图复制的对象是什么类型。在
即使是自引用对象也由
deepcopy
处理:x
和{当我们想将列表值赋给其他变量时,请使用copy和deepcopy e、 g
^{pr2}$相关问题 更多 >
编程相关推荐