Strange behavior when modifying array in for-loop -


take @ example:

julia> version v"0.4.0-rc1"  julia> foo = [1,2] 2-element array{int64,1}:  1  2  julia> baz = array(any,3) 3-element array{any,1}:  #undef  #undef  #undef  julia> = 1:3            foo[1] = -foo[1]            baz[i] = foo            println("loop",i)            println("foo: ",typeof(foo),"->",foo)            println("baz[",i,"]: ",typeof(baz[i]), "->", baz[i])            println("baz: ",typeof(baz),"->",baz)        end  loop1 foo: array{int64,1}->[-1,2] baz[1]: array{int64,1}->[-1,2] baz: array{any,1}->any[[-1,2],#undef,#undef] loop2 foo: array{int64,1}->[1,2] baz[2]: array{int64,1}->[1,2] baz: array{any,1}->any[[1,2],[1,2],#undef] loop3 foo: array{int64,1}->[-1,2] baz[3]: array{int64,1}->[-1,2] baz: array{any,1}->any[[-1,2],[-1,2],[-1,2]] 

the results unexpected me, think baz should any[[-1,2],[1,2],[-1,2]].

however, if foo not array, results reasonable.

julia> foo = 1 1  julia> baz = array(any,3) 3-element array{any,1}:  #undef  #undef  #undef  julia> = 1:3            foo = -foo            baz[i] = foo            println("loop",i)            println("foo: ",typeof(foo),"->",foo)            println("baz[",i,"]: ",typeof(baz[i]), "->", baz[i])            println("baz: ",typeof(baz),"->",baz)        end loop1 foo: int64->-1 baz[1]: int64->-1 baz: array{any,1}->any[-1,#undef,#undef] loop2 foo: int64->1 baz[2]: int64->1 baz: array{any,1}->any[-1,1,#undef] loop3 foo: int64->-1 baz[3]: int64->-1 baz: array{any,1}->any[-1,1,-1] 

my question happened here, what's correct way assign array in for-loop?

edit: added baz = deepcopy(baz) , goes fine. still want know reason.

julia has noteworthy differences other languages e.g. unlike matlab julia arrays assigned reference. reference alias, or alternate name existing variable. example, suppose make peter reference (alias) paul, can refer person either peter or paul. after baz[i] = foo, changing elements of foo modify baz[i] well.


Comments