究竟是什么关系pickle和copy.deepcopy?他们分享了哪些机制,以及如何?
很明显这两个是密切相关的操作,并分享了一些机制/协议,但我不能围绕细节.
我发现的一些(令人困惑的)事情:
__[gs]etstate__,则会调用它们deepcopy的实例.这让我感到惊讶,因为我认为它们是特定的pickle,但后来我发现Classes可以使用相同的接口来控制用于控制酸洗的复制.但是,没有关于 __[gs]etstate__深度复制时如何使用的文档(如何使用返回的值__getstate__,传递给__setstate__什么?)deepcopy将是pickle.loads(pickle.dumps(obj)).但是,这不可能等同于deepcopy',因为如果一个类定义了一个__deepcopy__操作,那么使用这个基于pickle的deepcopy实现就不会调用它.(我还偶然发现了一个声明,即深度复制比pickle更普遍,并且有许多类型是深度可复制的,但不是pickleable.)(1)表示共性,而(2)表示pickle和之间的差异deepcopy.
最重要的是,我发现了这两个相互矛盾的陈述:
copy_reg:pickle,cPickle和copy模块在pickle /复制这些对象时使用这些函数
和
该复制模块不使用copy_reg注册模块
对此,一方面,是之间的关系/共性的另一个指示pickle和deepcopy,而在另一方面,有助于我的困惑......
[我的经验是使用python2.7,但我也很感激有关python2和python3之间的pickle/deepcopy差异的任何指示]
我正在创建一个小型 Pandas 数据框:
df = pd.DataFrame(data={'colA': [["a", "b", "c"]]})
Run Code Online (Sandbox Code Playgroud)
我对该 df 进行了深度复制。我没有使用 Pandas 方法,而是使用通用 Python,对吧?
import copy
df_copy = copy.deepcopy(df)
Run Code Online (Sandbox Code Playgroud)
df_copy.head() 给出以下内容:
然后我将这些值放入字典中:
mydict = df_copy.to_dict()
Run Code Online (Sandbox Code Playgroud)
该字典看起来像这样:
最后,我删除列表中的一项:
mydict['colA'][0].remove("b")
Run Code Online (Sandbox Code Playgroud)
我很惊讶 df_copy 中的值已更新。我很困惑原始数据框中的值也被更新了!两个数据框现在看起来都是这样的:
我知道 Pandas 并没有真正进行深度复制,但这不是 Pandas 方法。我的问题是:
1)如何从不更新数据帧的数据帧构建字典?
2)如何获取完全独立的数据帧的副本?
感谢您的帮助!
干杯,尼古拉斯