我试图了解 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
也许这只是我上面选择的一个不好的例子,但我不知道深度复制会提供不同的结果(也许在我的简单示例中不会,但是否有一个久经考验的真实示例突出了深度复制和常规复制之间的区别?
重要的区别在于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]
为了补充@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