在 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。而是您尝试将其用作 keydict 的事实,这要求 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 中,无论列表的内容如何,​​如何按值而不是引用复制复杂嵌套元素的列表的主要内容,如果未能解决你的问题,请参考以下文章

python学习历程第8天

如何加载列表,向其中添加元素然后再次存储?

带有内容的Python深度getsizeof列表?

如何在扭曲的python中从服务器发送列表中的内容?

Python中列表的布尔值

如何将一个函数中的列表导入另一个 python 模块?