我正在使用来自第三方的一个漂亮的小python模块,我遇到了一些让我的大脑全部扭曲的东西,我最关心的是数据的完整性。
快速摘要:有一种类方法大致如下:
def as_dict(self):
##adjust some attributes that don't make sense outside this scope
##... ... ...
return self.__dict__
我手动使用此方法的结果,但有几个地方我传递它,我不知道这些函数实际上对返回的字典做了什么。
现在,这是安全的吗,还是一些迷路功能开始搞乱我的实例属性?我原本以为'self'以某种方式保护数据集,而且我传递了数据的副本,但现在我想知道我是否正在传递对实例内存的引用? (里面有嵌套的mutable)
我应该这样做:return copy.deepcopy(self.__dict__)
答案 0 :(得分:2)
你是对的,实例字典与任何其他字典一样完全可变。像那样返回这个词典是不寻常的。也许由于某种原因,它被修改为在实例之外被修改。看起来它可能是一个糟糕的设计。
有时人们会做那种可怕的事情,因为他们认为这比使用全局变量更好。
复制并不是一个好方法。它可能非常慢,只是隐藏了潜在的设计问题
复制的另一种方法是包装dict,使其无法被意外修改。
答案 1 :(得分:1)
如果您想确定传递副本,copy.deepcopy(self.__dict__)
就可以了。