假设我们有一个简单的Python字典:
dict_ = {'foo': 1, 'bar': 2}
复制这个字典的更好方法是什么?
copy1 = dict(dict_)
copy2 = dict_.copy()
有没有一个强有力的理由支持一种方法胜过另一种方法?
假设我们有一个简单的Python字典:
dict_ = {'foo': 1, 'bar': 2}
复制这个字典的更好方法是什么?
copy1 = dict(dict_)
copy2 = dict_.copy()
dict
构造函数:这使得你创建一个新的dict
更加明显,而调用对象上的copy
方法可能会复制任何东西。同样,对于list
,我更喜欢通过调用构造函数来复制,而不是通过切片来复制。dict
的子类,则使用copy
方法可能会变得混乱:>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> d['a']
0
>>> d.copy()
defaultdict(<class 'int'>, {'a': 0})
>>> dict(d)
{'a': 0}
>>>
< p > defaultdict
的 copy
方法可以给你另一个 defaultdict
,但是除非你在子类中覆盖 copy
方法,否则默认操作就是给你一个 dict
:< /p>
>>> class MyDict(dict): pass
>>> d = MyDict(a=1)
>>> d
{'a': 1}
>>> type(d)
<class '__main__.MyDict'>
>>> type(d.copy())
<class 'dict'>
copy
方法将返回哪种类型。有人可能更喜欢选项#1(dict(dict_)
),因为它符合最小惊讶原则:您也可以对列表执行相同的操作:list(list_)
,而且列表没有copy()
方法。
尽管如此,回答中提出了许多好观点。这表明可能没有明显更好的解决方案,只要您做您打算做的事情即可(例如,在某些代码中子类化dict
可能是至关重要的)。因此,我建议根据回答中提出的要点选择适合您应用程序的选项!
实际上,这取决于你打算用它做什么。在库中,您可能需要改变某个类似字典的对象的副本,并且您需要一个相同对象的副本。其他API必须有一个实际的dict
,因此会使用构造方法创建新的dict
并使用该方法。但是,当您这样做时,会丢失实际的原始类型信息(和方法)。但总体而言,我更喜欢使用copy()方法,因为它清楚地说明它是类似于字典的对象的副本(不只是一个字典)。这使其更加灵活(鸭子类型)。
dict_.copy()
,因为意图是自说明的。但是,使用dict
形式可以创建具有额外键的副本:d = dict(a, zoo=1, zar=2)
这与以下代码等效,但更短:
d = a.copy()
d.update(zoo=1, zar=2)
我不喜欢 dict.copy()
方法:
.copy()
做了什么样的复制copy.copy()
或 dict()
)想象一个随机类,例如 Uber
。- 你会如何尝试复制 u = Uber(...)
?
dict(u)
Uber(u)
u.copy()
copy.copy(u)
我认为第二种方案有最高的成功几率,或是失败的风险。- 这正是我想要的。