你的两个例子做同样的事情,但并不意味着
get与
setdefault做。
两者之间的区别基本上是手动设置
d[key]为每次指向列表,而不是仅在未设置时才
setdefault自动设置
d[key]为列表。
我使这两种方法尽可能相似
from timeit import timeitprint timeit("c = d.get(0, []); c.extend([1]); d[0] = c", "d = {1: []}", number = 1000000)print timeit("c = d.get(1, []); c.extend([1]); d[0] = c", "d = {1: []}", number = 1000000)print timeit("d.setdefault(0, []).extend([1])", "d = {1: []}", number = 1000000)print timeit("d.setdefault(1, []).extend([1])", "d = {1: []}", number = 1000000)并得到
0.7947233787110.8118822722560.7244292059990.722129751973
因此
setdefault比
get为此目的快10%。
该
get方法可以使您做的事 少于
使用
setdefault。
KeyError即使您不想设置密钥,也可以使用它来避免在密钥不存在时得到提示(如果那会经常发生)。
请参阅“ setdefault”的dict方法的用例,并且dict.get()方法返回一个指针,以获取有关这两种方法的更多信息。
关于主题的
setdefault结论是,大多数情况下,您想使用
defaultdict。关于该线程的
get结论是它很慢,通常最好(在速度方面)使用defaultdict或处理错误(取决于字典的大小和您的用例)进行双重查找。



