假设我们有一个简单的Python字典:
dict_ = {'foo': 1, 'bar': 2}
Run Code Online (Sandbox Code Playgroud)
哪个是复制这本词典的更好方法?
copy1 = dict(dict_)
copy2 = dict_.copy()
Run Code Online (Sandbox Code Playgroud)
是否有令人信服的理由支持一种方法而不是另一种方法?
我总是使用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}
>>>
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方法将返回什么类型.
人们可能会喜欢选项 #1 ( dict(dict_)),因为遵循最小惊喜原则:您可以对列表执行相同的操作:list(list_),并且列表没有方法copy()。
也就是说,答案中提出了许多好的观点。这表明可能没有任何明显更好的解决方案,并且只要您执行您打算执行的操作(dict例如,在某些代码中,关于子类化的点可能至关重要),两者都很好。因此,考虑到答复中提出的要点,我只会选择适合您的应用程序的任何内容!