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