0

我正在使用来自第三方的一个不错的小 python 模块,我遇到了一个让我的大脑完全扭曲的问题,我最关心的是数据完整性。

快速总结:有一个类方法大致如下:

def as_dict(self):
    ##adjust some attributes that don't make sense outside this scope        
    ##... ... ...
    return self.__dict__

我手动使用了这个方法的结果,但是有几个地方我传递了它,我不知道这些函数实际上对返回的字典做了什么。

现在,这是安全的,还是一些杂散的函数开始弄乱我的实例属性?我最初认为“自我”以某种方式保护了数据集,并且我正在传递数据的副本,但现在我想知道我是否正在传递对实例内存的引用?(里面有嵌套的可变对象)

我应该这样做:return copy.deepcopy(self.__dict__)

4

2 回答 2

2

你是对的,实例字典像任何其他字典一样完全可变。像这样返回字典是不寻常的。也许出于某种原因,它打算在实例之外进行修改。似乎它可能是一个糟糕的设计。

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

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

复制的替代方法是包装 dict,这样它就不会被意外修改。

于 2013-04-03T00:11:20.880 回答
1

如果您想确保通过副本,copy.deepcopy(self.__dict__)那将是要走的路。

于 2013-04-03T00:09:43.993 回答