2017-08-16 73 views
2

我的问题是关于数组元素的变化。 考虑下面的代码片段:朱莉娅:数组赋值行为

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。然后,您将同一个指针分配给第2行中的b,以便ab是对同一内存位置的引用。当您在阵列中更改元素时,不会更改ab指向的位置,以便ab都反映阵列中第一个内存偏移量中的新值。

在第二个示例中,您将创建一个数组并指定一个指向a的指针。然后,您分配与b相同的指针,就像以前一样,但您接下来会在不同的内存位置创建一个新阵列,并将指定的位置指定为aab现在指向两个不同的存储位置,每个存储位置都有自己的阵列。

这里有一个演示:

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