副本将回答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吗?如果它被忽略,为什么它甚至被传入?
答案 0 :(得分:1)
Python要求__deepcopy__()
方法接受一个参数memo
(docs):
为了让类定义自己的副本实现,它可以定义特殊方法
__copy__()
和__deepcopy__()
。前者被称为实现浅拷贝操作;没有传递其他参数。调用后者来实现深拷贝操作; 传递一个参数,即备忘录词典。如果__deepcopy__()
实现需要对组件进行深层复制,则应该以组件作为第一个参数并将备注字典作为第二个参数调用deepcopy()
函数。
其目的是
保留在当前复制过程中已复制的对象的“备忘录”字典
如果对象包含引用循环,则可以防止在复制期间出现递归循环。
我猜numpy不需要使用该参数,因为数组通常不包含对其他Python对象的递归引用,因此它被忽略。