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

时间:2016-01-31 22:34:01

标签: python

情况:在制作原始列表的副本后,我使用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()

1 个答案:

答案 0 :(得分:2)

some_list[:]只是一个浅层副本。你似乎需要一份深刻的副本

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]

您可以看到id中的original列表与id中的shallow相同。这意味着嵌套列表是完全相同的对象。修改一个嵌套列表时,更改也位于另一个列表中。

id的{​​{1}}不同。那只是副本。更改它们不会影响原始列表。