Julia 中的复制和深复制有什么区别?

log*_*ick 3 julia

我试图了解Juliacopy()deepcopy()Julia之间的区别。根据我在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
Run Code Online (Sandbox Code Playgroud)

也许这只是我上面选择的一个不好的例子,但我不知道深度复制会提供多少不同的结果(也许在我的简单示例中不会,但是否有一个经过验证的真实示例突出了深度复制和常规复制之间的区别?)。

pfi*_*seb 5

重要的区别在于它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]
Run Code Online (Sandbox Code Playgroud)


gio*_*ano 5

为了补充@pfitzseb答案,请注意,两者==isequal检查数组的相应元素在某种意义上是否相等,即使这两个对象在内存中不同,复制a到时仍然如此。b

===相反,该运算符检查两个对象对于任何程序是否都无法区分。用 Julia 的行话来说,这个运算符有时被称为等式:

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
Run Code Online (Sandbox Code Playgroud)