为什么Python的defaultdict采用工厂方法模式实现?
为什么defaultdict用无参工厂函数而非直接存储默认值
避免共享可变对象的问题
如果直接存储默认值(比如一个空列表),所有新键都会指向同一个对象。比如下面的错误场景:# 错误示范:假设直接存默认值列表 d = {} default_val = [] d['a'] = default_val d['a'].append(1) # 若访问新键b时返回default_val,结果会是[1],完全不符合预期而用
defaultdict(list)时,每次访问新键都会调用list()生成一个全新的空列表,每个键的默认值都是独立实例,不会互相干扰。支持动态生成的默认值
很多场景下默认值不是固定的,需要每次生成新的动态值。比如给每个新键分配随机数、唯一ID或当前时间:import random from collections import defaultdict d = defaultdict(lambda: random.randint(1, 10)) print(d['x']) # 可能输出3 print(d['y']) # 可能输出7,每次都是新的随机数如果直接存储一个固定值,所有新键都会得到同一个结果,完全达不到动态生成的效果。
统一处理所有类型的逻辑
不管是不可变类型(如int、str)还是可变类型(如list、dict),用工厂函数的方式能统一逻辑。不需要针对类型可变性做区分:不可变类型看似可以复用值,但可变类型必须生成新实例。用工厂函数的话,所有类型都通过调用函数获取默认值,实现更简洁一致,也避免了开发者额外考虑类型特性的麻烦。
内容的提问来源于stack exchange,提问作者Harry Richman
相关产品推荐
相关产品推荐

