Search code examples
collectionsjulia

Copy or clone a collection in Julia


I have created a one-dimensional array(vector) in Julia, namely, a=[1, 2, 3, 4, 5]. Then I want to create a new vector b, where b has exactly same elements in a, i.e b=[1, 2, 3, 4, 5].

It seems that directly use b = a just create a pointer for the original collection, which means if I modify b and a is mutable, the modification will also be reflected in a. For example, if I use !pop(b), then b=[1, 2, 3, 4] and a=[1, 2, 3, 4].

I am wondering if there is a official function to merely copy or clone the collection, which the change in b will not happen in a. I find a solution is use b = collect(a). I would appreciate that someone provide some other approaches.


Solution

  • b=copy(a)

    Should do what you want.

    methods(copy) will give you a list of methods for copy, which will tell you what types of a this will work for.

    julia> methods(copy)
    # 32 methods for generic function "copy":
    copy(r::Range{T}) at range.jl:324
    copy(e::Expr) at expr.jl:34
    copy(s::SymbolNode) at expr.jl:38
    copy(x::Union{AbstractString,DataType,Function,LambdaStaticData,Number,QuoteNode,Symbol,TopNode,Tuple,Union}) at operators.jl:194
    copy(V::SubArray{T,N,P<:AbstractArray{T,N},I<:Tuple{Vararg{Union{AbstractArray{T,1},Colon,Int64}}},LD}) at subarray.jl:29
    copy(a::Array{T,N}) at array.jl:100
    copy(M::SymTridiagonal{T}) at linalg/tridiag.jl:63
    copy(M::Tridiagonal{T}) at linalg/tridiag.jl:320
    copy{T,S}(A::LowerTriangular{T,S}) at linalg/triangular.jl:36
    copy{T,S}(A::Base.LinAlg.UnitLowerTriangular{T,S}) at linalg/triangular.jl:36
    copy{T,S}(A::UpperTriangular{T,S}) at linalg/triangular.jl:36
    copy{T,S}(A::Base.LinAlg.UnitUpperTriangular{T,S}) at linalg/triangular.jl:36
    copy{T,S}(A::Symmetric{T,S}) at linalg/symmetric.jl:38
    copy{T,S}(A::Hermitian{T,S}) at linalg/symmetric.jl:39
    copy(M::Bidiagonal{T}) at linalg/bidiag.jl:113
    copy(S::SparseMatrixCSC{Tv,Ti<:Integer}) at sparse/sparsematrix.jl:184
    copy{Tv<:Float64}(A::Base.SparseMatrix.CHOLMOD.Sparse{Tv<:Float64}, stype::Integer, mode::Integer) at sparse/cholmod.jl:583
    copy(A::Base.SparseMatrix.CHOLMOD.Dense{T<:Union{Complex{Float64},Float64}}) at sparse/cholmod.jl:1068
    copy(A::Base.SparseMatrix.CHOLMOD.Sparse{Tv<:Union{Complex{Float64},Float64}}) at sparse/cholmod.jl:1069
    copy(a::AbstractArray{T,N}) at abstractarray.jl:349
    copy(s::IntSet) at intset.jl:34
    copy(o::ObjectIdDict) at dict.jl:358
    copy(d::Dict{K,V}) at dict.jl:414
    copy(a::Associative{K,V}) at dict.jl:204
    copy(s::Set{T}) at set.jl:35
    copy(b::Base.AbstractIOBuffer{T<:AbstractArray{UInt8,1}}) at iobuffer.jl:38
    copy(r::Regex) at regex.jl:65
    copy(::Base.DevNullStream) at process.jl:98
    copy(C::Base.LinAlg.Cholesky{T,S<:AbstractArray{T,2}}) at linalg/cholesky.jl:160
    copy(C::Base.LinAlg.CholeskyPivoted{T,S<:AbstractArray{T,2}}) at linalg/cholesky.jl:161
    copy(J::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:17
    copy(A::Base.SparseMatrix.CHOLMOD.Factor{Tv}) at sparse/cholmod.jl:1070