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

2024-05-19 10:53:41 发布

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

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

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

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

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

我在google上找到了一个新的参考文献,然后我在google上找到了一个新的参考文献。我还找到了帮助我找到项目id的代码,所以我从头开始创建了origList,得到了前10个项目的id。我再次将列表切片,发现切片中的id与origList前十项的id匹配。在

我发现了更多的注释,建议使用一种更具Python式的复制列表的方法

^{pr2}$

我试过了,我还是发现圣殿骑士的身份证和奥利格利斯特的身份证是一致的。在

请不要提出更好的编码方法-我要在理解了复制的原理后,自己在列表理解中找出如何做到这一点

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

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

很有魅力


Tags: 项目对象方法代码id列表google切片
2条回答

如果复制对象,则不会复制其内容。在大多数情况下,这是你想要的。在你的情况下,你必须确保内容是自己复制的。你可以利用复制.deepcopy但是如果您有一个列表列表或类似的东西,我建议您使用copy = [l[:] for l in list_of_lists],这样会快得多。在

代码风格的一点提示:

  • del是一个语句而不是一个函数,所以最好不要在那里使用paren,它们只是令人困惑。在
  • 运算符周围和逗号后的空白将使代码更易于阅读。在
  • list(alist)复制了一个列表,但它并不比alist[:]更像python,我认为alist[:]甚至比替代列表更常用。在

切片创建浅拷贝。在您的示例中,我看到您在调用item[-1]上的insert(),这意味着item是一个列表列表。这意味着浅拷贝仍然引用原始对象。你可以把它看作是复制指针,而不是实际对象。在

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

相关问题 更多 >

    热门问题