この例を見てください:
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> for i = 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]]
結果は私には予想外でした、私はそうあるbaz
べきだと思いますAny[[-1,2],[1,2],[-1,2]]
。
ただし、foo
が配列でない場合、結果は妥当です。
julia> foo = 1
1
julia> baz = Array(Any,3)
3-element Array{Any,1}:
#undef
#undef
#undef
julia> for i = 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]
私の質問は、ここで何が起こったのか、forループで配列を割り当てる正しい方法は何ですか?
編集:私は追加しbaz = deepcopy(baz)
、すべてがうまくいきます。まだ理由を知りたい。
Juliaには、他の言語との顕著な違いがあります。たとえば、MATLABとは異なり、Julia配列は参照によって割り当てられます。参照は、エイリアス、または既存の変数の代替名です。たとえば、peterをpaulへの参照(エイリアス)にすると、その人をpeterまたはpaulのいずれかとして参照できます。の後baz[i] = foo
、の要素をfoo
変更するとbaz[i]
、も変更されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加