朱莉娅:数组赋值行为

abe*_*ysh 2 arrays 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
Run Code Online (Sandbox Code Playgroud)

但是,当我运行以下代码时:

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
Run Code Online (Sandbox Code Playgroud)

数组b保持不变?为什么这样,有人能解释一下吗?

sbr*_*ger 6

在第一个示例中,您将创建一个数组并将指向该数组的指针指定给a.然后,您相同的指针分配b在第2行,使ab对同一个内存位置的引用.当你改变数组中的元素时,你不会改变where ab指向的位置,这样两者ab两者都会反映数组中第一个内存偏移量中的新值.

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

这是一个演示:

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
Run Code Online (Sandbox Code Playgroud)