【问题标题】:copy list in python [duplicate]在python中复制列表[重复]
【发布时间】: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()吗?

标签: python list memory multidimensional-array


【解决方案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__ 方法。

      【讨论】:

        猜你喜欢
        • 2015-04-25
        • 2020-01-26
        • 2012-01-11
        • 1970-01-01
        • 2013-01-05
        • 2013-07-04
        • 2021-10-19
        相关资源
        最近更新 更多