为什么np.ndarray .__ deepcopy__需要一个多余的论点?

时间:2017-08-02 13:47:58

标签: python arrays numpy copy deep-copy

副本将回答what,但不会充分回答why或为什么文档中没有提及它,即使它是必需的。继续阅读更多......

有两种方法可以制作numpy数组的深层副本。一种方法是使用copy.deepcopy模块中的copy。另一种方法是直接致电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)

返回TypeError!但...

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]])

看来这个函数需要一个参数,但该参数可能与返回的副本无关。

文档中未提及此参数。这是一个doc bug吗?如果它被忽略,为什么它甚至被传入?

1 个答案:

答案 0 :(得分:1)

Python要求__deepcopy__()方法接受一个参数memodocs):

  

为了让类定义自己的副本实现,它可以定义特殊方法__copy__()__deepcopy__()。前者被称为实现浅拷贝操作;没有传递其他参数。调用后者来实现深拷贝操作; 传递一个参数,即备忘录词典。如果__deepcopy__()实现需要对组件进行深层复制,则应该以组件作为第一个参数并将备注字典作为第二个参数调用deepcopy()函数。

其目的是

  

保留在当前复制过程中已复制的对象的“备忘录”字典

如果对象包含引用循环,则可以防止在复制期间出现递归循环。

我猜numpy不需要使用该参数,因为数组通常不包含对其他Python对象的递归引用,因此它被忽略。