好吧,让我用一个简单的例子来解释这个问题:

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是我们的朋友。
目前,我这样做是为了解决我的背叛问题:
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

我正在寻找一种不那么低效和愚蠢的方式来处理自我分享的参考。
当然,我不会故意创建这样的数组,但我需要处理这样的情况:有人给了我一个代码。在大型数组上运行我的“解决方案”很慢,而且我有许多层次的嵌套数组,我负担不起为这些野兽制作这么大的字符串。

最佳答案

这里有一种方法可以处理列表、听写和不可变值的任意组合。

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 - 删除list-of-list中的共享引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54467214/

10-11 07:15