pickle
與copy.deepcopy
之間的關係究竟是什麼?他們分享什麼機制,以及如何?醃製與深層鏡檢之間的關係
很明顯,兩者是密切相關的操作,並且共享一些機制/協議,但是我無法將自己的頭圍繞細節。
一些(混亂)的東西,我發現:
- 如果一個類定義
__[gs]etstate__
,它們會在其實例的deepcopy
調用。這一開始讓我感到驚訝,因爲我認爲它們是特定於pickle
,但後來我發現Classes can use the same interfaces to control copying that they use to control pickling。然而,有沒有文檔__[gs]etstate__
如何deepcopying時使用(如何從__getstate__
返回的值時,什麼被傳遞到__setstate__
?) - 一個天真的替代實施
deepcopy
將pickle.loads(pickle.dumps(obj))
。然而,這不可能等同於深拷貝,因爲如果一個類定義了一個__deepcopy__
操作,就不會使用這種基於pickle的deepcopy實現來調用它。 (I也偶然發現deepcopy的比鹹菜更一般的,並有許多類型,其是deepcopyable,但不與pickle的聲明。)
(1)表示的通用性,而(2)表示的差pickle
和deepcopy
。
最重要的是,我發現這兩種矛盾的說法:
copy_reg:鹹菜,cPickle時,並複製模塊酸洗/複製這些對象
和
時使用這些功能copy模塊不使用copy_reg註冊模塊
此,一方面,是pickle
和deepcopy
之間的關係/共性的另一個跡象,而在另一方面,有助於我的困惑......
[我的經驗是python2.7 ,但我也很欣賞任何有關python2和python3之間pickle/deepcopy差異的指針]
哦,我在Python 2和3之間唯一的區別就是'copy_reg'模塊被重命名爲'copyreg'。 –
這使事情更清晰。謝謝 – shx2
呃,不。你有點不對。 'deepcopy'實際上不使用'__getstate__'和'__setstate__'。 'deepcopy'按順序使用'__deepcopy__',pickle的dispatch_table,'__reduce__'和'__reduce_ex__' ...。檢查代碼。 http://svn.python.org/projects/python/trunk/Lib/copy.py –