Arrays 为什么这两种不同的数组构造方法会产生不同的行为?
当我以两种不同的方式(例如Arrays 为什么这两种不同的数组构造方法会产生不同的行为?,arrays,julia,Arrays,Julia,当我以两种不同的方式(例如a和b)构造一个2元素数组时,当我将一个元素添加到其中一个内部数组时,会得到两种不同的结果。append!。基于构造每个数组后的输出,我希望它们完全相同 julia> a = [[],[]] 2-element Array{Array{Any,1},1}: Any[] Any[] julia> push!(a[1],1.0) 1-element Array{Any,1}: 1.0 julia> a 2-element Array{Array{
a
和b
)构造一个2元素数组时,当我将一个元素添加到其中一个内部数组时,会得到两种不同的结果。append!
。基于构造每个数组后的输出,我希望它们完全相同
julia> a = [[],[]]
2-element Array{Array{Any,1},1}:
Any[]
Any[]
julia> push!(a[1],1.0)
1-element Array{Any,1}:
1.0
julia> a
2-element Array{Array{Any,1},1}:
Any[1.0]
Any[]
julia> b = fill([],2)
2-element Array{Array{Any,1},1}:
Any[]
Any[]
julia> push!(b[1],1.0)
1-element Array{Any,1}:
1.0
julia> b
2-element Array{Array{Any,1},1}:
Any[1.0]
Any[1.0]
看看下面的例子。 希望行为如你所料 输入[1]: 输出[1]:
a_1 = Any[1.0]
a = Array{Any,1}[Any[1.0],Any[]]
输入[2]
输出[2]:
a_1 = Any[1.0,2.0]
a = Array{Any,1}[Any[1.0,2.0],Any[]]
输入[3]: 输出[3]:
b_n = Any[1.0]
b = Array{Any,1}[Any[1.0],Any[1.0]]
输入[4]:
输出[4]
b_n = Any[1.0,2.0]
b = Array{Any,1}[Any[1.0,2.0],Any[1.0,2.0]]
输入[5]:
输出[5]:
c_n = Any[1.0]
c = Array{Any,1}[Any[1.0],Any[1.0]]
输入[6]:
输出[6]:
c_n = Any[1.0,2.0]
c = Array{Any,1}[Any[1.0,2.0],Any[1.0,2.0]]
因此,输入[1]与
a
相同,输入[3]与b
每次放置[]
时,都会构造一个新的向量
因此,在第一种情况下:a=[[],[]]
创建一个包含两个新向量的向量,我在输入[1]中称之为a_1
和a_2
在第二种情况下:b=fill([],2]
在输入[3]中创建一个向量,我称之为b_n
,然后它用该向量b_n
填充长度为2的向量。
这与输入[3](带c
)中的示例相同。
我还不如说:[b_n,b_n]
正如前面所说的fill(b_n,2)
因此,它在每个位置引用相同的向量。因此,更改一个,就会同时更改两者。fill
将创建一个用相同对象的n个副本(浅层)初始化的数组,以便b[1]
===b[2]
,当您更新b[1]
时,您正在更新同样指向b[2]的相同对象
是否有类似的函数填充值而不是引用?
a=[[]for uuu.[in 1:10]为数组中的每个元素初始化一个空数组。
push!(b[1], 2.0)
@show b_n #Guess what this shows
@show b
b_n = Any[1.0,2.0]
b = Array{Any,1}[Any[1.0,2.0],Any[1.0,2.0]]
c_n = []
c = [c_n, c_n]
push!(c_n, 1.0)
@show c_n
@show c
c_n = Any[1.0]
c = Array{Any,1}[Any[1.0],Any[1.0]]
push!(c[1], 2.0)
@show c_n
@show c
c_n = Any[1.0,2.0]
c = Array{Any,1}[Any[1.0,2.0],Any[1.0,2.0]]