在Julia中,复制和深度复制有什么区别?

6

我正在尝试理解Julia中copy()deepcopy()之间的区别。根据我在Julia文档中所读到的,deepcopy()首先复制值,然后创建一个与我从中复制的原始对象无关的全新对象。这部分很清楚。我更困惑的是以下对象之间的关系:

julia> a = [1,2,3]
3-element Array{Int64,1}:
 1
 2
 3

julia> b = copy(a)
3-element Array{Int64,1}:
 1
 2
 3

julia> a == b
true

julia> isequal(a,b)
true

也许我上面选择的例子不太好,但我不知道深拷贝如何提供不同的结果(也许在我简单的例子中不会有区别,但是否有一个经过验证的例子可以突出深拷贝和普通拷贝之间的差异呢?)。
2个回答

9

重要的区别在于 deepcopy 是递归复制的,而 copy 不是:

julia> a = [[1,2,3], [4,5,6]];

julia> b = copy(a);

julia> c = deepcopy(a);

julia> a[1][1] = 11
11

julia> a
2-element Array{Array{Int64,1},1}:
 [11, 2, 3]
 [4, 5, 6]

julia> b
2-element Array{Array{Int64,1},1}:
 [11, 2, 3]
 [4, 5, 6]

julia> c
2-element Array{Array{Int64,1},1}:
 [1, 2, 3]
 [4, 5, 6]

5

作为对 @pfitzseb 答案 的补充,需要注意的是 ==isequal 都只检查数组的相应元素是否在某种意义上相等,即使将 a 复制到 b 中,这仍然是正确的,尽管两个对象在内存中是不同的。

=== 运算符则检查两个对象是否在任何程序中都无法区分。这个运算符有时在 Julia 的术语中被称为 egality

julia> a = [[1,2,3], [4,5,6]];

julia> b = copy(a);

julia> a == b
true

julia> isequal(a, b)
true

julia> a === b
false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接