从方法中返回自我.__ dict__

时间:2013-04-03 00:06:11

标签: python deep-copy

我正在使用来自第三方的一个漂亮的小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__)

2 个答案:

答案 0 :(得分:2)

你是对的,实例字典与任何其他字典一样完全可变。像那样返回这个词典是不寻常的。也许由于某种原因,它被修改为在实例之外被修改。看起来它可能是一个糟糕的设计。

有时人们会做那种可怕的事情,因为他们认为这比使用全局变量更好。

复制并不是一个好方法。它可能非常慢,只是隐藏了潜在的设计问题

复制的另一种方法是包装dict,使其无法被意外修改。

答案 1 :(得分:1)

如果您想确定传递副本,copy.deepcopy(self.__dict__)就可以了。