在映射对象的方法里,setdefault
可能是比较微妙的一个。我们虽然并不会每次都用它,但是一旦它发挥作用,就可以节省不少次键查询,从而让程序更高效。
当字典 d[k]
不能找到正确的键的时候,Python 会抛出异常,这个行为符合 Python
所信奉的“快速失败”哲学。也许每个 Python 程序员都知道可以用 d.get(k, default)
来代替 d[k]
,给找不到的键一个默认的返回值(这比处理 KeyError
要方便不少)。但是要更新某个键对应的值的时候,不管使用 __getitem__
还是 get
都会不自然,而且效率低。示例说明:
index = {'name': 'mmm', 'age': 18}
word = 'grade'
occurrences = index.get(word, []) # 提取 word 出现的情况,如果还没有它的记录,返回 []。
occurrences.append("一年级") # 把单词新出现的位置添加到列表的后面。
index[word] = occurrences # 把新的列表放回字典中,这又牵扯到一次查询操作
示例处理单词出现情况的三行,通过 dict.setdefault
可以只用一行解决。
index = {'name': 'mmm', 'age': 18}
word = 'grade'
# 获取单词的出现情况列表,如果单词不存在,把单词和一个空列表放进映射,然后返回
# 这个空列表,这样就能在不进行第二次查找的情况下更新列表了。
index.setdefault(word, []).append("一年级")
这二者等同也就是说,这样写:
# 方式一
my_dict.setdefault(key, []).append(new_value)
# 方式二
if key not in my_dict:
my_dict[key] = []
my_dict[key].append(new_value)
二者的效果是一样的,只不过后者至少要进行两次键查询——如果键不存在的话,就是三次,用 setdefault 只需要一次就可以完成整个操作。