在Python 2中,如何通过值而不是引用来复制复杂嵌套元素的列表,而不管列表的内容如何

In Python 2, how to copy list of complex nested elements by value, not reference, regardless of the list's content

我遇到了一些很好的问题和答案,关于按引用和按值(这个,这个和这个)复制列表。不幸的是,所有建议的解决方案都没有从所有嵌套结构中删除引用(尝试b = a[:]b = list(a)copy.copy…)。我最后的希望是copy.deepcopy,但当内部某个地方有一个数组时,它不适用于嵌套结构(我正在处理openpyxl列)。我在堆栈底部得到这个错误:

1
2
3
  File"C:\Python27\lib\copy.py", line 257, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
TypeError: unhashable type: 'array.array'

我的问题是:是否可以创建不带任何引用的列表a的完整副本,而不管a中嵌套了什么?


确实,你需要的是deepcopy。问题是StyleArray类不实现__deepcopy__

以下修复程序似乎可以完成此任务:

1
2
def __deepcopy__(self, memo):
    return self.__copy__()

注:__copy__已经是按值复制的(待核对)。

它还回答了更一般的问题:为了完整复制嵌套结构,非标准嵌套元素必须以某种方式指示如何复制它们自己。