Python 如果切片既不能创建列表的副本,也不能创建列表()的副本,如何才能获得列表的真实副本?

Python 如果切片既不能创建列表的副本,也不能创建列表()的副本,如何才能获得列表的真实副本?,python,list,copy,Python,List,Copy,我试图修改一个列表,由于我的修改变得有点棘手,而且我的列表很大,所以我使用以下代码从列表中提取了一部分 tempList=origList[0:10] for item in tempList: item[-1].insert(0 , item[1]) del item[1] 我这样做的想法是,对列表的所有修改都会影响圣堂武士对象,而不是origList对象 一旦我得到了正确的代码并在我的原始列表上运行它,前十项(索引为0-9)就受到我在测试上面打印的代码时的操作的影响 所以我

我试图修改一个列表,由于我的修改变得有点棘手,而且我的列表很大,所以我使用以下代码从列表中提取了一部分

tempList=origList[0:10]
for item in tempList:
    item[-1].insert(0 , item[1])
    del item[1]
我这样做的想法是,对列表的所有修改都会影响圣堂武士对象,而不是origList对象

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

所以我在谷歌上搜索了一下,我找到了一些参考资料,上面写着“切一片”会复制列表并创建一个新的列表。我还找到了帮助我找到项目id的代码,所以我从头开始创建了origList,获得了前十个项目的id。我再次对列表进行切片,发现切片中的ID与origList的前十项中的ID匹配

我发现更多的注释表明,复制列表的一种更具python风格的方法是使用

tempList=list(origList([0:10])
我试过了,但我仍然发现圣殿骑士的身份证与奥利格利斯特的身份证相符

请不要建议更好的编码方法——在我了解了复制的工作原理之后,我将自己在列表理解中找出如何进行编码

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

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

像魔咒一样工作

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


您的解决方案在于使用深度拷贝。Python为这类事情提供了一个解决方案。当你搜索时,你会发现更多关于浅复制和深复制的信息。

如果你复制一个对象,它的内容不会被复制。在大多数情况下,这可能是你想要的。在您的情况下,您必须确保内容由您自己复制。您可以使用copy.deepcopy,但如果您有一个列表或类似的列表,我建议您使用
copy=[l[:]for l in list\u of\u list]
,这应该会快得多

对代码样式的一点注意:

  • del是一个语句而不是一个函数,所以最好不要在那里使用paren,它们只是让人困惑
  • 运算符周围和逗号后的空格将使代码更易于阅读
  • list(alist)复制了一个列表,但它并不比alist[:]更像pythonic,我认为alist[:]甚至比其他方法更常用
非常有帮助的谷歌马上提出了深度与浅层的对比。谢谢你。德尔——我不知道,在尝试了这个,然后尝试了一些函数(id)之后,我发现了如何区分语句和函数之间的区别。我发现了一些带有del的代码,他们使用了parens。您的代码给了我新的ID,所以当我这样做时,它会深度复制我的列表:newl=[templast[:]for item in origList[0:10]]。不过,copy.deepcopy似乎更容易。我并没有说它比henry.precheur.org说的更像蟒蛇。但是谢谢,我学到了一些东西