我的问题是关于数组元素的更改。 请考虑以下代码段:
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
保持不变?为什么这样,有人可以解释一下吗?
答案 0 :(得分:6)
在第一个示例中,您将创建一个数组并将指向该数组的指针指定给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