python list.pop()修改原始列表(而不仅仅是复制)

python list.pop()修改原始列表(而不仅仅是复制),python,Python,情景:在复制了原始列表后,我使用pop修改了所述副本。事实证明,原始列表会受到更改的影响 即使在检查了原始列表和副本不是同一个对象之后,弹出副本的元素也会弹出原始列表中的相同元素 请参见下面的脚本示例。提前感谢你的帮助 l = [['1412898', 'Jack', 'headache med', '8ET-500'], ['1423859', 'Sonny', 'prostate med', '8ET-800'], ['1413836', 'Paco', 'headach

情景:在复制了原始列表后,我使用pop修改了所述副本。事实证明,原始列表会受到更改的影响

即使在检查了原始列表和副本不是同一个对象之后,弹出副本的元素也会弹出原始列表中的相同元素

请参见下面的脚本示例。提前感谢你的帮助

l = [['1412898', 'Jack', 'headache med', '8ET-500'],
     ['1423859', 'Sonny', 'prostate med', '8ET-800'],
     ['1413836', 'Paco', 'headache med', '8ET-500']]

class App(object):
    def __init__(self, info):
        self.fp_rows= info

    def sortbyauditor(self):
        self.fp_rows_copy = self.fp_rows[:]

        print self.fp_rows is self.fp_rows_copy
        for i in self.fp_rows_copy:
            i.pop(1)
        print self.fp_rows_copy
        print self.fp_rows

app= App(l)
app.sortbyauditor()

某些列表[:]
只是一个肤浅的副本。你似乎需要一份深度副本

from copy import deepcopy

copy = deepcopy(some_list)
编辑

要了解“一个对象影响另一个对象”的原因,请查看每个列表的
id

original = [[1, 2], [3, 4]]
shallow = original[:]
deep = deepcopy(original)

print([id(l) for l in original])
# [2122937089096, 2122937087880]

print([id(l) for l in shallow])
# [2122937089096, 2122937087880]

print([id(l) for l in deep])
# [2122937088968, 2122937089672]
您可以看到
original
中列表的
id
s与
shallow
中的
id
s相同。这意味着嵌套列表是完全相同的对象。修改一个嵌套列表时,更改也会出现在另一个列表中


deep
id
s不同。那只是复制品。更改它们不会影响原始列表。

这很有效,谢谢。我从未听说过深浅的复制品。但是,我仍然不知道一个物体如何影响另一个。谢谢。我现在明白了。当我开始学习(从几本书中)时,从未提到过浅拷贝/深拷贝的情况。他们提到的是:a=5。。。b=a。。。a=3。。。b->仍然是5,a现在是3。不管怎样,深度复制是有效的。但我也看到了元组等不可变对象的威力。请不要放弃投票。我搜索了好几个小时,但始终没有得到相关的答案。