在python中复制列表[重复]

Posted

技术标签:

【中文标题】在python中复制列表[重复]【英文标题】:copy list in python [duplicate] 【发布时间】:2011-10-23 00:56:56 【问题描述】:

因为我正在尝试制作列表的副本并使用列表的副本做一些事情。不知何故,我的原始列表也被修改了。我已经看过不同的内存分配和分配列表的不同方式。到目前为止还没有运气...有什么想法吗?

    row = 0
    column = 0
    table1 = copy.copy(table[:])

    temptable = []
    temptable = table[:]

    print id(table)
    print table
    print id(table1)
    print table1
    print id(temptable)
    print temptable

    for i in temptable:
        for j in i:
            if type(j) == str:
                temptable[row][column] = 0
            column = column + 1
        column = 0
        row = row + 1
    result=[]   

    for column in zip(*temptable):
        try:
                result.append(sum(map(int,column)))
            except ValueError:
                result.append(0)


    print table
    print table1
    print temptable

/####结果

163783148
[[0, 'ZZZ', 'XXX', 'YYY', 'AAA', 0, 0], ['BBB', 1, 1, 0, 26, 28, 0], ['CCC', 26, 0, 0, 0, 26, 0], ['DDD', 0, 26, 0, 0, 26, 0], ['EEE', 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]

163669036
[[0, 'ZZZ', 'XXX', 'YYY', 'AAA', 0, 0], ['BBB', 1, 1, 0, 26, 28, 0], ['CCC', 26, 0, 0, 0, 26, 0], ['DDD', 0, 26, 0, 0, 26, 0], ['EEE', 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]

163783468
[[0, 'ZZZ', 'XXX', 'YYY', 'AAA', 0, 0], ['BBB', 1, 1, 0, 26, 28, 0], ['CCC', 26, 0, 0, 0, 26, 0], ['DDD', 0, 26, 0, 0, 26, 0], ['EEE', 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]

[[0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 26, 28, 0], [0, 26, 0, 0, 0, 26, 0], [0, 0, 26, 0, 0, 26, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]

[[0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 26, 28, 0], [0, 26, 0, 0, 0, 26, 0], [0, 0, 26, 0, 0, 26, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]

[[0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 26, 28, 0], [0, 26, 0, 0, 0, 26, 0], [0, 0, 26, 0, 0, 26, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]

【问题讨论】:

你试过copy.deepcopy()吗? 【参考方案1】:

您的原始列表包含内部列表:

[[0, 'ZZZ', 'XXX', 'YYY', 'AAA', 0, 0], 
 ['BBB', 1, 1, 0, 26, 28, 0], ...
]

内部列表实际上存储为引用,即:

[ location-of-list-0, 
  location-of-list-1, ...
]

当您复制列表时,您实际上将引用列表复制到存储在原始列表中的相同列表。这称为浅拷贝,因为它复制的是引用而不是内容。

使用deep copy 创建一个完全独立的列表。

插图

原始列表

浅拷贝

深拷贝

【讨论】:

插图+1 谢谢!使用 Google Docs Draw 工具制作,顺便说一句。【参考方案2】:

您还需要deepcopy 来复制列表中的对象,而不仅仅是引用。

【讨论】:

【参考方案3】:

您还应该复制内部列表,所以deepcopy 可以帮助您。

【讨论】:

【参考方案4】:

由于[:] 只创建实际应用切片的列表的副本切片,因此对对象的引用保持不变。 使用 deepcopy 会递归地复制每个可以指出的项目。

class Foo:

    def __init__(self):
        self.name   = "unknown"

    def __repr__(self):
        return "Foo: " + self.name

    def __copy__(self):
        f = Foo()
        f.name = self.name
        return f

    def __deepcopy__(self, d):
        return self.__copy__()

lst = [Foo()]
lst[0].name = "My first foo"

lst2 = lst[:]
lst2.append(Foo())
lst2[1].name = "My second foo"

print lst
print lst2

输出

[Foo:我的第一个 foo] [Foo:我的第一个 foo,Foo:我的第二个 foo]

lst2[0].name = "I changed the first foo"

print lst
print lst2

输出

[Foo:我改变了第一个 foo] [Foo:我改变了第一个 foo,Foo:我的第二个 foo]

from copy import deepcopy
lst[0].name = "My first foo"
lst3 = deepcopy(lst)
lst3[0].name = "I changed the first foo again !"

print lst
print lst3

输出

[Foo:我改变了第一个 foo] [Foo:我又换了第一个 foo!]

列表、元组等确实支持__copy____deepcopy__ 方法。

【讨论】:

以上是关于在python中复制列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 列表中删除重复项并保持顺序? [复制]

Python复制列表问题[重复]

在 Python 中,从列表中删除重复项以使所有元素都是唯一的*同时保留顺序*的最快算法是啥? [复制]

我想读取带有数字的外部文件并将它们复制到列表中。 Python [重复]

Python中的递归函数不会更改列表[重复]

在 Python 元组列表中查找重复项