2017-08-02 32 views
4

重複的會回答what,但不會充分回答why或者爲什麼沒有在文檔中提到,即使它是必需的。請閱讀更多...爲什麼np.ndarray .__ deepcopy__需要一個多餘的參數?


有兩種方法制作numpy數組的深度副本。一種方法是使用copy模塊中的copy.deepcopy。另一種方法是直接撥打array.__deepcopy__

docs

ndarray.__deepcopy__() → Deep copy of array. 

用於如果copy.deepcopy稱爲陣列上。

文檔提示調用此函數的正確方法是沒有任何參數的。但是...

In [47]: x 
Out[47]: 
array([[1, 1], 
     [2, 2]]) 

In [48]: x.__deepcopy__() 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-48-00c3b8eda618> in <module>() 
----> 1 x.__deepcopy__() 

TypeError: __deepcopy__() takes exactly 1 argument (0 given) 

A TypeError is returned!但是......

In [51]: x.__deepcopy__(None) 
Out[51]: 
array([[1, 1], 
     [2, 2]]) 

即使...

In [52]: x.__deepcopy__([12345, 'blah blah']) 
Out[52]: 
array([[1, 1], 
     [2, 2]]) 

看來此功能,需要一個說法,但這樣的說法理應有對返回的副本沒有關係。

這種說法是不是在文件中提及。它是一個文檔錯誤?爲什麼如果它被忽略甚至傳入?

回答

1

Python的要求__deepcopy__()方法取一個參數memodocs):

爲了一個類來定義自己的副本實現,它可以定義特殊的方法__copy__()__deepcopy__()。前者被稱爲實施淺拷貝操作;沒有其他參數傳遞。後者被稱爲執行深層複製操作; 它傳遞一個參數,備忘字典。如果__deepcopy__()實現需要使一個組件的深層副本,它應該叫deepcopy()功能與組件作爲第一個參數和備忘錄字典作爲第二個參數。

其目的是

保持當前複印通

這防止遞歸環路中已複製的對象的一個​​「備忘錄」字典複製如果對象包含參考循環期間。

我猜numpy的不需要用這樣的說法,因爲一個陣列通常不抱到其他Python對象遞歸引用,所以它會被忽略。

+0

嗯,不錯。所以你會考慮這個缺乏提及文檔錯誤? –

+2

沒有,因爲我不認爲你應該直接在正常使用期間調用'__whatever__'功能。 – kazemakase

相關問題