制作Python字典的浅表副本的最佳方法是什么?

dav*_*ers 7 python

假设我们有一个简单的Python字典:

dict_ = {'foo': 1, 'bar': 2}
Run Code Online (Sandbox Code Playgroud)

哪个是复制这本词典的更好方法?

copy1 = dict(dict_)
copy2 = dict_.copy()
Run Code Online (Sandbox Code Playgroud)

是否有令人信服的理由支持一种方法而不是另一种方法?

Dun*_*can 8

我总是使用dict构造函数:它显然是你创建一个新的,dictcopy在一个对象上调用方法可能是复制任何东西.同样,list我更喜欢通过切片调用构造函数进行复制.

请注意,如果使用dict使用该copy方法的子类可能会引起混淆:

>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> d['a']
0
>>> d.copy()
defaultdict(<class 'int'>, {'a': 0})
>>> dict(d)
{'a': 0}
>>> 
Run Code Online (Sandbox Code Playgroud)

给你另一个的copy方法,但除非你在子类中重写,默认动作只是为了给你一个:defaultdictdefaultdictcopydict

>>> class MyDict(dict): pass

>>> d = MyDict(a=1)
>>> d
{'a': 1}
>>> type(d)
<class '__main__.MyDict'>
>>> type(d.copy())
<class 'dict'>
Run Code Online (Sandbox Code Playgroud)

这意味着你必须知道子类的内部细节,才能知道该copy方法将返回什么类型.


Eri*_*got 3

人们可能会喜欢选项 #1 ( dict(dict_)),因为遵循最小惊喜原则:您可以对列表执行相同的操作:list(list_),并且列表没有方法copy()

也就是说,答案中提出了许多好的观点。这表明可能没有任何明显更好的解决方案,并且只要您执行您打算执行的操作(dict例如,在某些代码中,关于子类化的点可能至关重要),两者都很好。因此,考虑到答复中提出的要点,我只会选择适合您的应用程序的任何内容!