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

时间:2016-06-14 16:51:30

标签: 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]
....

但是,如果我打电话给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]
...

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

1 个答案:

答案 0 :(得分: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

显示数组时的输出#undef表示数组中未初始化的条目。这类似于C,C ++或Java中的null值,但与null不同,Julia #undef中的非一等类:它不是您可以使用的值或绕过;任何使用未定义的字段或数组插槽都是一个直接的例外。

一般来说,Julia不是“面向点的语言”:而在Python或Java中,您可能希望obj.frob访问obj的{​​{1}}或{{1}在朱莉娅fr {frob,这不太可能是正确的事情。您很可能会改为obj.frizzle()obj