import copy class DefaultDict(dict): """Dictionary with a default value for unknown keys.""" def __init__(self, default): self.default = default def __getitem__(self, key): if key in self: return self.get(key) else: ## Need copy in case self.default is something like [] return self.setdefault(key, copy.deepcopy(self.default)) def __copy__(self): copy = DefaultDict(self.default) copy.update(self) return copy