Dict с ключом массива в Юлии - PullRequest
0 голосов
/ 17 февраля 2019

На языке джулии (версия 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, так что я думаю, это как-то связано с хэш-функцией, но я не смог понять исходный код .

collect(keys(d))[1] == x == [1,2,3,4]
# true

Может кто-нибудь объяснить, что вызывает такое поведение, или предложить ресурсы, которые ястоит посмотреть?

1 Ответ

0 голосов
/ 17 февраля 2019

Функция ключа, которую нужно изучить: ht_keyindex.

Там вы можете видеть, что для того, чтобы ключ был найден, он должен оба:

Существует неустранимое значениевероятность того, что после изменения x он будет иметь такое же значение hashindex и ключ будет найден.Например, здесь вы можете установить индекс 4 из x в 5, и все, по-видимому, будет работать:

julia> x[4] = 5
5

julia> x
4-element Array{Int64,1}:
 1
 2
 3
 5

julia> haskey(d, x)
true

Следовательно, как и в любом другом языке программирования, поддерживающем словари аналогичным образом, изменяющиеся ключи словаря не должныбыть сделаноПриведенное выше обсуждение должно быть на практике только теоретическим.

...