Copying of arrays and array elements

Hey guys!

I discovered this kind of behaviour in Julia. Say that I define a vector as as:

a = [1 2 3]

Then I define:

b = a[2]

And:

c = a

If I now change a by:

a[2] = 4
a
1×3 Array{Int64,2}:
 1  4  3

Then c becomes:

c
1×3 Array{Int64,2}:
 1  4  3

But b is still:

b = 2

So my question is, how do I turn of this behaviour / or control it? Could I copy a without later a change in a would become a change in c? And am I able to do it in a way so that b changes corresponding to the element change at index 2 of a, as defined initially (b = a[2])?

I hope my question makes sense. I am using Julia 1.2.0

Kind regards

Yes. As you said yourself, you can copy(a) and then changing a won’t change in the copied a that you assign to c.

You cannot do b = 2 and observe it in a or assign to a[2] = 3 while making b == 2.
You can create a view of the array as b = @view a[2]. Note that b will NOT be a number anymore.

Thanks for clarifying! I have one follow up question. When I use @view you say that it is not a number anymore. Could you elaborate on that a bit? I am still able to say b+b and it will output a number.

Kind regards

Well,

julia> a = [1, 2, 3]
3-element Array{Int64,1}:
 1
 2
 3

julia> b = @view a[1]
0-dimensional view(::Array{Int64,1}, 1) with eltype Int64:
1

julia> b + 1
ERROR: MethodError: no method matching +(::SubArray{Int64,0,Array{Int64,1},Tuple{Int64},true}, ::Int64)
Closest candidates are:
  +(::Any, ::Any, ::Any, ::Any...) at operators.jl:529
  +(::Complex{Bool}, ::Real) at complex.jl:297
  +(::Missing, ::Number) at missing.jl:115
  ...
Stacktrace:
 [1] top-level scope at REPL[3]:1

julia> b + b
0-dimensional Array{Int64,0}:
2

julia> isa(b, Number)
false

julia> isa(b, AbstractArray)
true

It’s not a Number, it’s an (abstract) array.

Behavioral wise, just because you can add it to itself doesn’t means it’s a number and indeed the result of that isn’t a number (this might have produced a number on 1.0/1.1 and was changed/fixed on master) In either case, adding a number to it doesn’t work.

Great, thanks once again.

Kind regards