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

2023-11-27

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

some_list[:]只是一个浅拷贝。你似乎需要一个深拷贝

from copy import deepcopy

copy = deepcopy(some_list)

Edit

要理解为什么“一个对象会影响另一个对象”,请查看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列表中的 soriginalids in shallow。这意味着嵌套列表是完全相同的对象。当您修改一个嵌套列表时,更改也会出现在另一列表中。

The ids for deep是不同的。那只是副本。更改它们不会影响原始列表。

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

python list.pop() 修改原始列表(不仅仅是复制) 的相关文章

随机推荐