我在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
,顺便说一句,我也不知道这意味着什么。 ¿在什么意义上未定义?
答案 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
。