gpt4 book ai didi

python - 在深度复制期间防止引用重用

转载 作者:行者123 更新时间:2023-12-04 01:03:20 25 4
gpt4 key购买 nike

考虑以下示例:

from copy import deepcopy

item = [0]
orig = [item, item]
copy = deepcopy(orig)

orig[0][0] = 1
print(f"{orig=} {copy=}")

copy[0][0] = 2
print(f"{orig=} {copy=}")
第一 print输出我期望的结果,因为列表中重复了相同的引用。
orig=[[1], [1]] copy=[[0], [0]]
然而,第二个 print让我吃了一惊。
orig=[[1], [1]] copy=[[2], [2]]
我本来以为 deepcopy最终在 copy 中得到两个独立的引用列表。相反,它维护了重复的单个列表引用的属性。我猜这在 the docs 的这一部分中有所提及。 :

A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.


我看到 deepcopy函数有一个 memo争论。有什么有趣的事情可以用这个参数来防止重复引用,这样最终的输出会变成:
orig=[[1], [1]] copy=[[2], [0]]

最佳答案

如果您的重点是复制可能来自 JSON 的数据,即列表、字典、字符串、数字、 bool 值,那么您可以轻松实现自己的函数:

def copy_jsonlike(data):
if isinstance(data, list):
return [copy_jsonlike(x) for x in data]
elif isinstance(data, dict):
return {k: copy_jsonlike(v) for k,v in data.items()}
else:
return data
它有一个额外的好处,可能比 copy.deepcopy 更快。
或者,您的原始解决方案, json.loads(json.dumps(data))也不是一个坏主意。

关于python - 在深度复制期间防止引用重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67429227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com