What is the philosophy behind arrays not being copied when assigned to another variable?

Oh, 100% - no shade at all intended :slight_smile:

1 Like

Note there is another difference.

Slicing, or range indexing, in numpy creates a view.

In [1]: import numpy as np
In [2]: a = np.zeros(5)
In [3]: a[0] = 3
In [4]: b = a[0:2]
In [5]: b[0] = 5
In [6]: a[0]
Out[6]: 5.0

Slicing in Julia creates a copy.

julia> a = zeros(5)
5-element Vector{Float64}:
 0.0
 0.0
 0.0
 0.0
 0.0

julia> b = a[1:2]
2-element Vector{Float64}:        
 0.0
 0.0

julia> b[1] = 5
5

julia> a[1]
0.0

Unless one explicitly creates a view in Julia.

julia> c[1] = 7                   
7     
                            
julia> a[1]                       
 7.0

Is this still consistent?

1 Like

I know. I was just making fun of an obvious typo๐Ÿ˜„

My cat approves of this example, as do I. :smile_cat:

code
julia-1.9> a_cat = split("""
                      .......................................
                      .......................................
                      ...........................ไท€ไท€..........
                      ............................ไท€ไท€.........
                      .............................ไท€.........
                      .............................ไท€ไท€........
                      ..........ไท€ไท€.................ไท€ไท€........
                      ..........ไท€ไท€.................ไท€ไท€........
                      .........ไท€ไท€ไท€ไท€................ไท€.........
                      ........ไท€ไท€ไท€ไท€ไท€ไท€...............ไท€.........
                      ........ไท€ไท€ไท€ไท€ไท€ไท€ไท€.............ไท€ไท€.........
                      ..........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€..........
                      ...........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€..........
                      ...........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........
                      ...........ไท†ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........
                      ............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........
                      ............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........
                      .............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........
                      .............ไท€ไท€ไท€ไท€ไท€.....ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........
                      .............ไท€ไท€.ไท€ไท€.....ไท€ไท€ไท€.ไท€ไท€ไท€ไท€........
                      .............ไท€..ไท€ไท€.....ไท€ไท€....ไท€ไท€........
                      ............ไท€ไท€...ไท€.....ไท€ไท€.....ไท€........
                      ............ไท€....ไท€ไท€...ไท€ไท€......ไท€........
                      ...........ไท€ไท€.....ไท€..ไท€ไท€......ไท€ไท€........
                      .......................................
                      .......................................""");

julia-1.9> tiger = a_cat;

julia-1.9> fluffy = a_cat
26-element Vector{SubString{String}}:
 "......................................."
 "......................................."
 "...........................ไท€ไท€.........."
 "............................ไท€ไท€........."
 ".............................ไท€........."
 ".............................ไท€ไท€........"
 "..........ไท€ไท€.................ไท€ไท€........"
 "..........ไท€ไท€.................ไท€ไท€........"
 ".........ไท€ไท€ไท€ไท€................ไท€........."
 "........ไท€ไท€ไท€ไท€ไท€ไท€...............ไท€........."
 "........ไท€ไท€ไท€ไท€ไท€ไท€ไท€.............ไท€ไท€........."
 "..........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........."
 "...........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........."
 "...........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "...........ไท†ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 ".............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 ".............ไท€ไท€ไท€ไท€ไท€.....ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........"
 ".............ไท€ไท€.ไท€ไท€.....ไท€ไท€ไท€.ไท€ไท€ไท€ไท€........"
 ".............ไท€..ไท€ไท€.....ไท€ไท€....ไท€ไท€........"
 "............ไท€ไท€...ไท€.....ไท€ไท€.....ไท€........"
 "............ไท€....ไท€ไท€...ไท€ไท€......ไท€........"
 "...........ไท€ไท€.....ไท€..ไท€ไท€......ไท€ไท€........"
 "......................................."
 "......................................."

julia-1.9> tiger == fluffy
true

julia-1.9> reverse!(tiger)
26-element Vector{SubString{String}}:
 "......................................."
 "......................................."
 "...........ไท€ไท€.....ไท€..ไท€ไท€......ไท€ไท€........"
 "............ไท€....ไท€ไท€...ไท€ไท€......ไท€........"
 "............ไท€ไท€...ไท€.....ไท€ไท€.....ไท€........"
 ".............ไท€..ไท€ไท€.....ไท€ไท€....ไท€ไท€........"
 ".............ไท€ไท€.ไท€ไท€.....ไท€ไท€ไท€.ไท€ไท€ไท€ไท€........"
 ".............ไท€ไท€ไท€ไท€ไท€.....ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........"
 ".............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "...........ไท†ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "...........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "...........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........."
 "..........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........."
 "........ไท€ไท€ไท€ไท€ไท€ไท€ไท€.............ไท€ไท€........."
 "........ไท€ไท€ไท€ไท€ไท€ไท€...............ไท€........."
 ".........ไท€ไท€ไท€ไท€................ไท€........."
 "..........ไท€ไท€.................ไท€ไท€........"
 "..........ไท€ไท€.................ไท€ไท€........"
 ".............................ไท€ไท€........"
 ".............................ไท€........."
 "............................ไท€ไท€........."
 "...........................ไท€ไท€.........."
 "......................................."
 "......................................."

julia-1.9> fluffy
26-element Vector{SubString{String}}:
 "......................................."
 "......................................."
 "...........ไท€ไท€.....ไท€..ไท€ไท€......ไท€ไท€........"
 "............ไท€....ไท€ไท€...ไท€ไท€......ไท€........"
 "............ไท€ไท€...ไท€.....ไท€ไท€.....ไท€........"
 ".............ไท€..ไท€ไท€.....ไท€ไท€....ไท€ไท€........"
 ".............ไท€ไท€.ไท€ไท€.....ไท€ไท€ไท€.ไท€ไท€ไท€ไท€........"
 ".............ไท€ไท€ไท€ไท€ไท€.....ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........"
 ".............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "............ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "...........ไท†ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "...........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€........."
 "...........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........."
 "..........ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€ไท€.........."
 "........ไท€ไท€ไท€ไท€ไท€ไท€ไท€.............ไท€ไท€........."
 "........ไท€ไท€ไท€ไท€ไท€ไท€...............ไท€........."
 ".........ไท€ไท€ไท€ไท€................ไท€........."
 "..........ไท€ไท€.................ไท€ไท€........"
 "..........ไท€ไท€.................ไท€ไท€........"
 ".............................ไท€ไท€........"
 ".............................ไท€........."
 "............................ไท€ไท€........."
 "...........................ไท€ไท€.........."
 "......................................."
 "......................................."


10 Likes

Perhaps, out of the topic, but

Why would I have created b in the first place?

I often use assignment to โ€œunpackโ€ structs or to keep simplicity of both usage and developing of a function. For the latter, I prefer to give clear names of the arguments to a user. But, for the developer, the names may be a bit crypty, e.g. short. Juliaโ€™s and Pythonโ€™s behavior of assignment helps me create interfaces comfortable for both โ€œsidesโ€, also Swift syntactically supports this.

A short example

function optimize(target_function, initial_guess)
   f = target_function
   x0 = initial_guess
   ...
end
2 Likes