如果切片不会创建列表的副本,list() 也不会创建列表的副本,我怎样才能获得列表的真实副本?

2024-03-30

我正在尝试修改一个列表,由于我的修改变得有点棘手并且我的列表很大,所以我使用以下代码获取了列表的一部分

tempList=origList[0:10]
for item in tempList:
    item[-1].insert(0 , item[1])
    del item[1]

我这样做是认为对列表的所有修改都会影响 tempList 对象而不是 origList 对象。

好吧,一旦我得到了正确的代码并在原始列表上运行它,前十项(索引 0-9)就会受到我在测试上面打印的代码时的操作的影响。

所以我用谷歌搜索了它,我找到了一些参考资料,说取一个切片会复制列表并创建一个新的。我还找到了帮助我找到项目 id 的代码,因此我从头开始创建了 origList,获取了前十个项目的 id。我再次对列表进行切片,发现切片中的 id 与 origList 的前十项中的 id 匹配。

我发现更多的注释建议使用一种更Pythonic的方式来复制列表

tempList=list(origList([0:10])

我尝试过,但仍然发现 tempList 中的 id 与 origList 中的 id 匹配。

请不要建议更好的编码方法 - 在我了解复制的工作原理之后,我将自己弄清楚如何在列表理解中执行此操作

根据Kai的回答,正确的方法是:

import copy
tempList=copy.deepcopy(origList[0:10])
id(origList[0])
>>>>42980096
id(tempList[0])
>>>>42714136

奇迹般有效


切片创建一个浅拷贝。在你的例子中,我看到你正在打电话insert() on item[-1],这意味着该项目是列表的列表。这意味着您的浅拷贝仍然引用原始对象。您可以将其视为复制指针,而不是实际对象。

您的解决方案在于使用深拷贝反而。 Python 提供了一个复制模块 http://docs.python.org/library/copy.html就为了这种事。当您搜索时,您会发现更多有关浅复制和深复制的信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果切片不会创建列表的副本,list() 也不会创建列表的副本,我怎样才能获得列表的真实副本? 的相关文章

随机推荐