在Julia中,如何创建唯一的,空的可变对象数组?

时间:2019-10-07 18:54:28

标签: arrays julia

helpstring for fill说:

help?> fill
search: fill fill! finally findall filter filter! filesize filemode FileSyntax FileSchema isfile CSVFile @__FILE__ CSVFileSyntax fieldtype fieldname

  fill(x, dims)

  Create an array filled with the value x. For example, fill(1.0, (5,5)) returns a 5×5 array of floats, with each element initialized to 1.0.

...

  If x is an object reference, all elements will refer to the same object. fill(Foo(), dims) will return an array filled with the result of evaluating
  Foo() once.

请注意最后一段:

  

如果x是对象引用,则所有元素都将引用同一对象。 fill(Foo(), dims)将返回一个数组,其中填充了一次对Foo()求值的结果。

所以我想知道, 是如何构造一个n个唯一对象的数组?

例如说我想要3个空的,分开的字典的数组。


相关:Creating an Array of Arrays in Julia

3 个答案:

答案 0 :(得分:5)

我能想到的最好的方法是使用理解力:

julia> ds = [Dict() for _ in 1:3]
2-element Array{Dict{Any,Any},1}:
 Dict()
 Dict()
 Dict()

这是最好的方法吗?谢谢!

答案 1 :(得分:3)

这是我可以想到的两种选择:

julia> map(_ -> Dict(), 1:3)
3-element Array{Dict{Any,Any},1}:
 Dict()
 Dict()
 Dict()

julia> (_ -> Dict()).(1:3)
3-element Array{Dict{Any,Any},1}:
 Dict()
 Dict()
 Dict()

但是在实践中,我会按照您的建议理解。

答案 2 :(得分:1)

如文档中所述

  

fill(Foo(),dims)将返回一个数组,其中填充了   一次评估Foo()

因此,这就是您要避免的事情:

julia> a = fill(Dict(), 4)
4-element Array{Dict{Any,Any},1}:
 Dict()
 Dict()
 Dict()
 Dict()

julia> a[1]["foo"] = :bar
:bar

julia> a
4-element Array{Dict{Any,Any},1}:
 Dict("foo" => :bar)
 Dict("foo" => :bar)
 Dict("foo" => :bar)
 Dict("foo" => :bar)

因此,方法是使用话语中所述的列表理解:

julia> a = [Dict() for i in 1:4]
4-element Array{Dict{Any,Any},1}:
 Dict()
 Dict()
 Dict()
 Dict()

julia> a[1]["foo"] = :bar
:bar

julia> a
4-element Array{Dict{Any,Any},1}:
 Dict("foo" => :bar)
 Dict()
 Dict()
 Dict()

相关问题: https://discourse.julialang.org/t/initialize-array-of-arrays/11610/4