【发布时间】:2013-12-08 23:16:58
【问题描述】:
我有一个对象,其中包含几个字典,其中填充了其他对象以及一个 id 和对象对列表。
每次对其中一个字典进行更改时,生成此对象的 n 个副本的最 Pythonic 方式是什么?
例如:
class B(object):
pass
class A(object):
def __init__(self):
d = {1: B(), 2: B(), 3: B()}
a = A()
b = [(1, B()), (2, B())]
我想生成两个 a 的副本,每个副本都有一个不同的 B 实例。如果可能的话,我想避免使用 deepcopy。
编辑:因为我被要求更具体:
我正在运行 n 次计算,每次更改某个子模块的一个参数。我想避免在内存中保存子模块的 n 个副本,因为它是一个相当大的对象,我想避免重新初始化模拟的其他部分。因此,我想要一个初始化的基础对象,我想要对其进行 n 次小的修改,从而使用不同的参数运行 n 次计算。
【问题讨论】:
-
为什么要避免在这里使用
deepcopy()?b与创建A()的副本有什么关系? -
请注意,
A.d是一个 class 属性。A()的所有实例都共享该属性,此处无需复制。如果A.d应该是实例属性,请将其设置为__init__。 -
最后但同样重要的是,
A.d,即使它是一个实例属性,也不会改变。如果您想要一个新的A()并为B()提供新值,只需创建一个新实例。此处无需复制。 -
首先,这就是我想避免 deepcopy 的原因:twitter.com/gvanrossum/status/383618349000691712 其次,很抱歉 - 我现在修复了它。它应该是一个实例属性。第三,我不想创建 A 类的新实例的原因是因为它是一个非常大的对象,我希望副本除了一个小的变化之外是相同的,即更新一个字典元素。
-
那是因为每当使用 deepcopy 时,程序员就放弃了,选择了便宜的选择。 很少需要使用 deepcopy。重新考虑这种情况并询问是否真的需要完整对象层次结构的深层副本。
标签: python copy generator deep-copy