2016-06-14 8 views
3

Ich habe ein Wörterbuch von Histogrammen gemacht, mit vielen Einträgen. Die Tasten sind 4-Element-Integer-Arrays als einfacher Aufruf an das Objekt zurückkehrt:Warum produziert Julia #undef Schlüssel im Wörterbuch?

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] 
.... 

Aber wenn ich Histogramas.keys rufen dann bekomme ich diese sehr seltsame Ausgabe:

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] 
... 

Also habe ich fast zweimal Tasten wie es Einträge des Wörterbuchs gibt, und die meisten der zusätzlichen sind #undef, was ich übrigens auch nicht weiß, was das bedeutet. ¿Undefiniert in welchem ​​Sinne?

Antwort

6

Das ist nicht der richtige Weg, um eine Dict Schlüssel zu erhalten - Sie versehentlich auf die privaten internen Felder des Dict Objekts zugreifen. Der richtige Weg eines Dict ‚s Schlüssel zuzugreifen, ist die keys Funktion auf der Dict Objekt aufzurufen:

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 

Der Ausgang #undef wenn ein Array anzeigt zeigt einen nicht initialisierten Eintrag in dem Array. Dies ist ähnlich wie ein null Wert in C, C++ oder Java, aber im Gegensatz zu null, in Julia #undef ist nicht First-Class: Es ist kein Wert, den Sie verwenden oder weitergeben können; Jede Verwendung eines nicht definierten Feld- oder Array-Slots ist eine unmittelbare Ausnahme.

Im Allgemeinen Julia ist keine „dot orientierte Sprache“: während in Python oder Java Sie vielleicht erwarten zu tun obj ‚zuzugreifen s frob oder obj.frizzle() tun obj brutzeln, in Julia, das ist unwahrscheinlich, dass das Recht auf seine etwas zu tun. Sie würden höchstwahrscheinlich frob(obj) und frizzle(obj) stattdessen tun.

+0

Und die Punktnotation, was ist ihre Verwendung in Julia dann? Vielen Dank, Stefan, du beantwortest immer meine Fragen! – wpkzz

+0

Die Punktnotation gilt nur für den wörtlichen Feldzugriff. Es gab Diskussionen darüber, dass es überlastet sein könnte, aber das ist noch nicht geschehen. – StefanKarpinski