Why doesn't modifying a shallow copy of an array reflect on the original?

Because even a shallow copy has to mean something other than just adding a reference to the same object. The behavior you expect you would get from doing

b = even_numbers

This is a better example of a shallow copy:

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

julia> b = copy(a)
2-element Array{Array{Int64,1},1}:
 [1, 2]
 [3, 4]

julia> push!(b[1], 5)
3-element Array{Int64,1}:
 1
 2
 5

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

julia> b
2-element Array{Array{Int64,1},1}:
 [1, 2, 5]
 [3, 4]
5 Likes