class Test_Defaults: def default_factory(self, x=None, type=None): if x is None: return self.default_by_type(type) else: return x def default_by_type(self, type): strategy_operations = { "list" : list, "dict" : dict, "set" : set, } operation = strategy_operations.get(type.__class__.__name__) if operation is None: raise ValueError return operation() def __init__(self): self.x = self.default_factory(None, []) a = Test_Defaults() b = Test_Defaults() a.x.append(1) print(a.x == b.x) # False as expected