为什么这两种构造数组的不同方式会产生不同的行为?

时间:2016-12-10 06:51:27

标签: arrays julia

当我以两种不同的方式构造一个2元素数组时(例如ab,当我向一个内部数组添加一个元素时,我得到两个不同的结果。这也发生在{ {1}}。基于构造每个后的输出,我希望它们完全相同?

append!

2 个答案:

答案 0 :(得分:3)

Check == False将创建一个初始化为相同对象的n个副本(浅)的数组,以便fill === b[1],当你更新b[2],您正在更新b[1]中也指向的同一对象。

答案 1 :(得分:2)

看看以下示例。 希望行为符合您的期望。

输入[1]:

a_1 = []
a_2 = []
a = [a_1, a_2]
push!(a_1, 1.0)
@show a_1 
@show a

输出[1]:

a_1 = Any[1.0]
a = Array{Any,1}[Any[1.0],Any[]]

输入[2]

push!(a[1], 2.0)
@show a_1 #Guess what this shows
@show a

输出[2]:

a_1 = Any[1.0,2.0]
a = Array{Any,1}[Any[1.0,2.0],Any[]]

输入[3]:

b_n = []
b = fill(b_n, 2)
push!(b_n, 1.0)
@show b_n 
@show b 

输出[3]:

b_n = Any[1.0]
b = Array{Any,1}[Any[1.0],Any[1.0]]

输入[4]:

push!(b[1], 2.0)
@show b_n #Guess what this shows
@show b

输出[4]

b_n = Any[1.0,2.0]
b = Array{Any,1}[Any[1.0,2.0],Any[1.0,2.0]]

输入[5]:

c_n = []
c = [c_n, c_n]
push!(c_n, 1.0)
@show c_n 
@show c 

输出[5]:

c_n = Any[1.0]
c = Array{Any,1}[Any[1.0],Any[1.0]]

输入[6]:

push!(c[1], 2.0)
@show c_n 
@show c

输出[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相同

每次放置[]时,您都会构建一个新的Vector

所以在第一种情况下:a=[[],[]]创建一个包含两个新向量的向量,我在Input [1]中调用a_1a_2

在第二种情况下:b=fill([],2]创建一个向量,我在Input [3]中调用b_n,然后使用该向量b_n填充长度为2的向量。 这与Input [3](带c)中的示例相同。 我可能会说:[b_n, b_n]fill(b_n,2)

所述

因此它引用了每个位置的相同向量。所以改变一个,改变两者。