python - 删除列表列表中的共享引用?

标签 python reference nested-lists deep-copy

好的,我用一个简单的例子来说明问题:

l = [[0]]*3       # makes the array [[0], [0], [0]]
l[0][0] = 42      # l becomes [[42], [42], [42]]
from copy import deepcopy
m = deepcopy(l)   # m becomes [[42], [42], [42]]
m[0][0] = 2       # m becomes [[2], [2], [2]]

这是一个基本的共享引用问题。除了通常情况下,当这样的问题发生时,deepcopy 是我们的 friend 。 目前,我这样做是为了解决我的 deepcopy 背叛问题:

l = [[0]]*3       # makes the array [[0], [0], [0]]
import JSON
m = JSON.loads(JSON.dumps(l)) # m becomes [[0], [0], [0]] with no self references

我正在寻找一种低效且不那么愚蠢的方式来处理 self 共享引用。

当然我不会故意制作这样的数组,但我需要处理有人给我的代码一个数组的情况。在大型数组上运行我的“解决方案”很慢,而且我有很多级别的嵌套数组,我无法为那些野兽制作这么大的字符串。

最佳答案

这是一种适用于列表、字典和不可变值的任意组合的方法。

def very_deep_copy(obj):
    if isinstance(obj, list):
        return [very_deep_copy(item) for item in obj]
    elif isinstance(obj, dict):
        return {k: very_deep_copy(v) for k,v in obj.items()}
    else:
        return obj

l = [[0]]*3 
m = very_deep_copy(l)
m[0][0] = 2
print(m)

结果:

[[2], [0], [0]]

关于python - 删除列表列表中的共享引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54467214/

相关文章:

c++ - ostream/ofstream 继承问题

html - 带嵌套 UL LI 的 DIV UL LI 未使用清除 :both 扩展

python - 解决折叠纸挑战

python - Keras LSTM 的输入转换

java - Java中不同引用类型的使用

python - 复制生成器

c++ - 除非从方法本身内部调用方法不会更改值

python - 对嵌套列表求和

python - 将 *args 作为列表传递时如何禁用 "E1120: No value for argument if"的 pylint 报告

python - Django 可以找到我的静态文件,Pycharm 无法解析它们