亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python不能腌制getset_descriptor

Python不能腌制getset_descriptor

蕭十郎 2022-07-19 11:00:30
我正在嘗試types.MappingProxyType:class MyClass:    l = [1, 2]proxy = MyClass.__dict__然后我想從這個代理中提取字典:d = proxy.copy()print(type(d))#<class 'dict'>然后我想附加一些東西來列出值d:d["l"].append(3)但這也會影響proxy(當然):>>> print(proxy["l"])[1, 2, 3]我不想影響我們的proxy,所以我嘗試使用copy.deepcopy:import copydict_2 = copy.deepcopy(d)它給出了一個錯誤:Traceback (most recent call last):  File "C:\Users\Din?el\AppData\Local\Programs\Python\Python37\istihza.py", line 18, in <module>    dict_2 = copy.deepcopy(d)  File "C:\Users\Din?el\AppData\Local\Programs\Python\Python37\lib\copy.py", line 150, in deepcopy    y = copier(x, memo)  File "C:\Users\Din?el\AppData\Local\Programs\Python\Python37\lib\copy.py", line 240, in _deepcopy_dict    y[deepcopy(key, memo)] = deepcopy(value, memo)  File "C:\Users\Din?el\AppData\Local\Programs\Python\Python37\lib\copy.py", line 169, in deepcopy    rv = reductor(4)TypeError: can't pickle getset_descriptor objects我知道復制模塊正在嘗試使用泡菜模塊用于復制的功能。 https://docs.python.org/3/library/copy.html#copy.deepcopy類可以使用相同的接口來控制它們用來控制酸洗的復制。有關這些方法的信息,請參閱模塊 pickle 的描述。實際上,copy 模塊使用了 copyreg 模塊中注冊的 pickle 函數。問題是,類型d是dict. 我們可以對字典進行深度復制:copy.deepcopy({"this":["is", "a", "dict"]})那么如果 type of dis dict,為什么我不能對其進行深度復制?或者是d不是真正的 dict 類型,它只是 Python 中的一個 hack?
查看完整描述

1 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

d確實是一本字典。您遇到的問題是 pickle 無法序列化獨立于類的類的方法和屬性。當您查看內容時,d您會看到:


{'__module__': '__main__',

 'l': [1, 2, 3],

 '__dict__': <attribute '__dict__' of 'MyClass' objects>,

 '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,

 '__doc__': None}

__dict__和的值__weakref__是對象的屬性MyClass。您不能在不序列化的情況下對它們進行序列化MyClass。


此外,如果您檢查每一個的類型,您可以看到這是您看到的錯誤的來源:


type(d['__dict__']), type(d['__weakref__'])

# returns:

(getset_descriptor, getset_descriptor)


查看完整回答
反對 回復 2022-07-19
  • 1 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號