在 Python 2 中,无论列表的内容如何,如何按值而不是引用复制复杂嵌套元素的列表
Posted
技术标签:
【中文标题】在 Python 2 中,无论列表的内容如何,如何按值而不是引用复制复杂嵌套元素的列表【英文标题】:In Python 2, how to copy list of complex nested elements by value, not reference, regardless of the list's content 【发布时间】:2018-01-09 18:26:38 【问题描述】:我遇到了一些关于按引用与按值复制列表的好问题和答案(this、this 和 this)。不幸的是,没有一个提议的解决方案从所有嵌套结构中删除引用(尝试过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
中嵌套了什么?
【问题讨论】:
您的错误不是由于deepcopy
。而是您尝试将其用作 key
到 dict
的事实,这要求 key
是可散列的类型。
您在整个结构上调用一次copy.deepcopy
,所有内容都会被递归复制:b = copy.deepcopy(a)
然而,copy.py
python 模块是错误的根源。
我想我没听懂你们的意思。 @CoryKramer,这个结构中可能有一些 dict 但为什么重要? @COLDSPEED 这就是我所做的。在我的情况下:tmp_columns = deepcopy([r for r in ws.columns])
它会抛出 TypeError
。
@Artur 随便tmp_columns = deepcopy(ws.columns)
。
【参考方案1】:
确实,deepcopy
正是您所需要的。问题是StyleArray
类没有实现__deepcopy__
。
以下修复似乎可以解决问题:
def __deepcopy__(self, memo):
return self.__copy__()
注意:__copy__
已经是按值复制的(待检查)。
它还回答了您更一般的问题:为了制作嵌套结构的完整副本,非标准嵌套元素必须以某种方式指示如何复制自己。
【讨论】:
谢谢!为了回答和解释。让我明天上班检查一下,之后我会标记为答案。 我深入查看了copy
模块,文档说This version does not copy types like module, class, function, method, nor stack trace, stack frame, nor file, socket, window, nor array, nor any similar types.
使用此深度复制定义修改数组模块是否正确?
找出答案的一个好方法是测试:克隆,以某种方式更改样式(StyleArray
状态),然后与原始样式进行比较。我的猜测是 copy
模块默认情况下不会复制数组,因为它可能会默默地引入内存和时间损失。无论如何,这并不意味着这样做是被禁止或“错误的”。以上是关于在 Python 2 中,无论列表的内容如何,如何按值而不是引用复制复杂嵌套元素的列表的主要内容,如果未能解决你的问题,请参考以下文章