为什么Julia在Dictionary中生成#undef键?

wpk*_*kzz 3 arrays dictionary julia

我在Julia上制作了一个直方图字典,里面有很多条目.键是4个元素的整数数组,因为对该对象的简单调用返回:

In[88] Histogramas
Out[88] Dict{Array{Int64,N},Array{T,N}} with 36540 entries:
  [56,8,39,55]  => [0,2,4,7,19,44,61,76,124,116  …  0,0,0,0,0,0,0,0,0,0]
  [64,20,48,55] => [284,368,202,106,35,3,2,0,0,0  …  0,0,0,0,0,0,0,0,0,0]
  [54,9,50,54]  => [0,0,0,0,0,0,0,0,0,2  …  1,0,0,0,0,0,0,0,0,0]
  [37,26,45,61] => [0,6,11,35,47,86,113,133,136,139  …  0,0,0,0,0,0,0,0,0,0]
  [37,15,51,50] => [673,272,48,5,2,0,0,0,0,0  …  0,0,0,0,0,0,0,0,0,0]
  [35,22,53,45] => [331,370,201,69,25,4,0,0,0,0  …  0,0,0,0,0,0,0,0,0,0]
  [37,25,56,40] => [460,382,127,27,3,0,1,0,0,0  …  0,0,0,0,0,0,0,0,0,0]
....
Run Code Online (Sandbox Code Playgroud)

但是,如果我打电话,Histogramas.keys那么我得到这个非常奇怪的输出:

Out[90] : 65536-element Array{Array{Int64,N},1}:
 #undef          
 #undef          
    [56,8,39,55] 
 #undef          
    [64,20,48,55]
    [54,9,50,54] 
 #undef          
    [37,26,45,61]
    [37,15,51,50]
...
Run Code Online (Sandbox Code Playgroud)

所以我得到了几乎两倍的密钥,因为有字典的条目,而且大多数额外的是#undef,顺便说一句,我也不知道这意味着什么.¿在什么意义上未定义?

Ste*_*ski 5

这不是获取Dict密钥的正确方法- 您不小心访问了Dict对象的私有内部字段.访问Dict密钥的正确方法是调用对象keys上的Dict函数:

julia> d = Dict(:foo => 1.2, :bar => 2.3, :baz => 3.4)
Dict{Symbol,Float64} with 3 entries:
  :bar => 2.3
  :baz => 3.4
  :foo => 1.2

julia> keys(d)
Base.KeyIterator for a Dict{Symbol,Float64} with 3 entries. Keys:
  :bar
  :baz
  :foo
Run Code Online (Sandbox Code Playgroud)

#undef显示数组时的输出表示数组中未初始化的条目.这类似于nullC,C++或Java中的值,但不像nullJulia #undef是非一等的:它不是一个可以使用或传递的值; 任何使用未定义的字段或数组槽都是一个直接的例外.

在一般情况下,Julia是不是一个"点取向的语言":而在Python或Java你可能希望做obj.frob访问objfrob还是obj.frizzle()以焦枯obj,在朱莉娅是不太可能做正确的事情.你最有可能做的frob(obj)frizzle(obj)来代替.