2017-08-16 22 views
2

私の質問は、配列要素の変更についてです。 次のコードスニペットを考えてみましょう。しかしJulia:配列の割り当て動作

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

julia> b = a 
2×2 Array{Int64,2}: 
1 2 
3 4 

julia> a[1,1] = -1 
-1 

julia> b 
2×2 Array{Int64,2}: 
-1 2 
    3 4 

、私は以下の代わりに実行したとき:

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

julia> b = a 
2×2 Array{Int64,2}: 
1 2 
3 4 

julia> a = [5 6; 7 8] 
2×2 Array{Int64,2}: 
5 6 
7 8 

julia> b 
2×2 Array{Int64,2}: 
1 2 
3 4 

アレイbは変わりませんか?それはなぜですか、誰もこれを説明できますか?

+1

可能な複製(https://stackoverflow.com/questions/33002572/creating-copies-in-julia-with-operator:ここ

はデモです) – Gnimuc

答えて

6

最初の例では、配列を作成し、その配列へのポインタをaに割り当てます。同じポインタをbに2行目に割り当てます。したがって、abは同じメモリ位置への参照になります。配列内の要素を変更すると、abが指している場所が変更されないため、abの両方が配列内の最初のメモリオフセットの新しい値を反映します。

2番目の例では、配列を作成し、aへのポインタを割り当てます。以前と同じポインタをbに割り当てますが、次に別のメモリ位置に新しい配列を作成し、の位置をaに割り当てます。 abは、それぞれ独自の配列を持つ2つの異なるメモリ位置を指しています。 [=演算子とジュリアでコピーを作成する]の

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

julia> pointer(a) # show the memory location of the array 
Ptr{Int64} @0x000000011cd1a120 

julia> b = a 
2×2 Array{Int64,2}: 
1 2 
3 4 

julia> pointer(b) # note - same memory location 
Ptr{Int64} @0x000000011cd1a120 

julia> a = [5 6; 7 8] 
2×2 Array{Int64,2}: 
5 6 
7 8 

julia> pointer(a) # note - new array; new memory location 
Ptr{Int64} @0x000000011d259e80 

julia> pointer(b) # still referencing the first array's location. 
Ptr{Int64} @0x000000011cd1a120 
+1

_pointer_と_reference_という言葉はあまり正しくなく、他の言語の人たちを知っている人たちを混乱させるでしょう。私はそれらを_binding_または_naming_と置き換えます。 JMWの古典的なブログ記事:[値対バインディング:地図は領土ではありません]を参照してください(http://www.johnmyleswhite.com/notebook/2014/09/06/values-vs-bindings-the-map-is-テリトリーではない/)。 –

+0

このメタファーへのx-ref:[箱と形とカラフルなステッカーの表](http://blog.leahhanson.us/post/julia/variables.html)。 – Gnimuc