我遇到了一些关于按引用复制列表与按值(这个、这个和这个(复制列表的好问题和答案。不幸的是,没有一个建议的解决方案从所有嵌套结构中删除引用(尝试b = a[:]
,b = list(a)
,copy.copy
...(。我最后的希望是copy.deepcopy
但是当内部某处有一个数组时,它不适用于嵌套结构(我正在处理 openpyxl 列(。我在堆栈底部收到此错误:
File "C:Python27libcopy.py", line 257, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
TypeError: unhashable type: 'array.array'
我的问题是:是否可以创建没有任何引用的列表a
的完整副本,无论a
嵌套了什么?
事实上,deepcopy
就是你需要的。问题是StyleArray
类没有实现__deepcopy__
。
以下修复程序似乎可以完成这项工作:
def __deepcopy__(self, memo):
return self.__copy__()
注意:__copy__
已经是按值复制(待检查(。
它还回答了您更通用的问题:为了制作嵌套结构的完整副本,非标准嵌套元素必须以某种方式指示如何复制自己。