在Python2中,如何通过值而不是引用复制复杂嵌套元素的列表,而不考虑列表';内容

在Python2中,如何通过值而不是引用复制复杂嵌套元素的列表,而不考虑列表';内容,python,list,reference,Python,List,Reference,我遇到了一些关于按引用复制列表与按值复制列表(、和)的好问题和答案。不幸的是,没有一个建议的解决方案从所有嵌套结构中删除引用(尝试b=a[:],b=list(a),copy.copy…)。我最后的希望是copy.deepcopy,但当内部某处有数组时,它不适用于嵌套结构(我正在处理openpyxl列)。我在堆栈的底部得到这个错误: File "C:\Python27\lib\copy.py", line 257, in _deepcopy_dict y[deepcopy(key, m

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

  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
中嵌套了什么?

确实,
深度复制
是您需要的。问题是
StyleArray
类没有实现
\uuuuuuuuuuuuuuuuuuuuuuuu

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

def __deepcopy__(self, memo):
    return self.__copy__()
注意:
\uuuuuu copy\uuuuu
已经是值拷贝(待检查)


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

您的错误不是由于
deepcopy
造成的。事实上,您正试图将其用作
dict
键,这要求
键必须是可散列类型。您在整个结构上调用
copy.deepcopy
一次,所有内容都会递归复制:
b=copy.deepcopy(a)
,python模块是错误的根源。我想我没有正确理解你们@CoryKramer,也许在这个结构中有一些dict,但为什么它会重要呢@我就是这么做的。在我的例子中:
tmp\u columns=deepcopy([r代表ws.columns中的r])
它抛出
TypeError
@Artur Just do
tmp\u columns=deepcopy(ws.columns)
。谢谢!回答和解释。让我在工作中检查一下这个tommorow,然后我会将它标记为答案。我在
copy
模块中进行了更深入的研究,文档说
这个版本不复制模块、类、函数、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口或数组等类型,也没有任何类似的类型。
使用此deepcopy定义修改阵列模块是否正确?一个很好的方法是测试:克隆,以某种方式更改样式(
StyleArray
状态),并与原始样式进行比较。我的猜测是,
copy
模块默认情况下不会复制数组,因为它可能会默默地引入内存和时间惩罚。无论如何,这并不意味着禁止或“错误”这样做。