朱莉娅的复制和深拷贝有什么区别?



我试图了解 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

最新更新