Arrays 朱莉娅:数组赋值行为

Arrays 朱莉娅:数组赋值行为,arrays,julia,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 但是,当我运行以下命令时: julia> a = [1 2; 3 4] 2×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
是否保持不变?为什么会这样,有人能解释一下吗?

在第一个示例中,您正在创建一个数组,并将指向该数组的指针分配给
a
。然后将同一指针指定给第2行中的
b
,以便
a
b
是对同一内存位置的引用。当您在数组中变异一个元素时,您不会更改
a
b
指向的位置,这样
a
b
都会反映数组中第一个内存偏移量中的新值

在第二个示例中,创建一个数组,并将指针指定给
a
。然后,与前面一样,将同一指针指定给
b
,但接下来在不同的内存位置创建一个新数组,并将该位置指定给
a
a
b
现在指向两个不同的内存位置,每个位置都有自己的数组

下面是一个演示:

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
“指针”和“引用”这两个词可能重复,但这两个词并不完全正确,很可能会让从其他语言了解它们的人感到困惑。我会用绑定或命名来代替它们。请参阅JMW的经典博文:。另请参阅此隐喻的x-ref:。