【问题标题】:What is the difference between copy and deep copy in Julia?Julia 中的复制和深复制有什么区别?
【发布时间】:2020-02-01 13:54:22
【问题描述】:

我试图了解 Julia 中 copy()deepcopy() 之间的区别。根据我在the Julia docs 中读到的内容,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

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

【问题讨论】:

    标签: julia


    【解决方案1】:

    重要的区别在于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]
    

    【讨论】:

      【解决方案2】:

      为了补充@pfitzseb answer,请注意==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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-23
        • 2013-02-13
        • 2011-04-26
        • 2016-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多