在julia语言(1.1.0版)中,我正在尝试对字典密钥进行更改时会发生什么情况。
在突变之前,变量x
和[1,2,3]
都被识别。
x = [1,2,3]; d = Dict(x=>"x")
haskey(d, x)
# true
haskey(d, [1,2,3])
# true
一旦我突变了x
,就不会识别变量x
和[1,2,3,4]
。
push!(x, 4)
haskey(d, x)
# false
haskey(d, [1,2,3,4])
# false
haskey(d, [1,2,3])
# false
从值的角度来看,键是“等于” x
的键,所以我想这与哈希函数有关,但无法理解source code。
collect(keys(d))[1] == x == [1,2,3,4]
# true
有人可以解释造成这种现象的原因,还是建议我应该看看的资源?
答案 0 :(得分:2)
要研究的关键功能是ht_keyindex
。
您可以看到,要找到该密钥,必须同时进行以下操作:
hashindex
)。在将x
进行突变后,它具有相同的hashindex
值并找到了密钥的可能性是不可忽略的。例如,您可以在此处将x
的索引4设置为5,所有这些似乎都可以工作:
julia> x[4] = 5
5
julia> x
4-element Array{Int64,1}:
1
2
3
5
julia> haskey(d, x)
true
因此-像任何支持字典的编程语言一样,都不应该对字典的键进行更改。以上讨论实际上仅是理论上的讨论。