2016-05-08 3 views
3

Мне нужно использовать несколько хеш-таблиц, поэтому в я бы обычно использовал std::unordered_map. До сих пор я могу понять, что я могу использовать словарь в Python, так что давайте предположим следующий код:К пониманию словарей

my_dict_1 = {} 
my_dict_1['foo'] = 1 
my_dict_2 = {} 
my_dict_2['foo'] = 2 

Будут ли словари использоваться различные хеш-функции (обратите внимание, что ключ тот же), таким образом, они могут считаться двумя разными хеш-таблицами (я имею в виду, что они фактически хранят данные по-разному)?


EDIT:

Да словари два разных объекта, конечно, но речь идет о технике, что они будут использовать для хранения данных!

+0

Они явно не совпадают с хеш-таблицей. –

+0

@JohnColeman благодарит за upvote. Не могли бы вы указать на какую-то документацию? Я очень новичок в [tag: Python], и это не так ясно для меня. :/Что вы говорите, так это то, что каждый словарь имеет свою собственную хэш-функцию, не так ли? Интересно, если они тоже * независимы *, но это для более поздних ... :) – gsamaras

+0

Что вы подразумеваете под «различными хеш-функциями»? Хэш-функция - это часть кода (и она определяется реализацией). Это, безусловно, разные словари (хеш-таблицы), хотя (поскольку они построены по двум различным объектам). Это не имеет ничего общего со словарями, кстати. –

ответ

2

Простой эксперимент Python оболочки, чтобы показать, что различные словари могут использовать один и тот же ключ:

>>> my_dict_1 = {'foo':1} 
>>> my_dict_2 = {'foo':2} 
>>> my_dict_1,my_dict_2 
({'foo': 1}, {'foo': 2}) 

This является хорошая дискуссия о том, как она реализуется. Ключевым моментом является то, что каждому словарю выделяется собственная часть памяти (которая, естественно, может расти по мере необходимости). Точная же хэш-функция используется для обоих словарей, но используется для зондирования различных областей памяти.

+0

Точная же функция хэша? Черт, тогда это означает, что, если мы будем кормить оба словаря теми же самыми данными, они будут хранить их одинаково (в разных местах памяти, но меня это не волнует), спасибо, Джон! – gsamaras

+2

@gsamaras: Я просто просмотрел исходный код, и, похоже, хеш вычисляется только с помощью * ключа *, а не, например, соленая с именем dict или что-то в этом роде. Кроме того, «Хэши для целых чисел такие же, как целое число (хеш (100) == 100), но - это деталь реализации и может быть изменена без предупреждения». (https://mail.python.org/pipermail/tutor/2003-August/024555.html) – usr2564301

+0

@RadLexus, вот что я называю хорошим комментарием, спасибо! – gsamaras

1

идентификатор (...)

идентификатор (объект) -> целое

Возвращает идентичность объекта. Это гарантированно будет уникальным среди одновременно существующих объектов. (Подсказки: это адрес памяти объекта.)

Выше строка id документа, он говорит, что идентичность объекта является адресом памяти объекта, поэтому мы можем использовать функцию id, чтобы увидеть адрес памяти переменного:

В своей программе я могу увидеть адрес, как это:

def main(): 
    my_dict_1 = {} 
    my_dict_1['foo'] = 1 
    my_dict_2 = {} 
    my_dict_2['foo'] = 2 
    print(hex(id(my_dict_1['foo']))) 
    print(hex(id(my_dict_2['foo']))) 

if __name__ == '__main__': 
    main() 

этот вывод программы это:

0x9a33e0 
0x9a3400 

Мы можем видеть, что my_dict_1['foo'] и my_dict_2['foo'] имеют разные адреса памяти.

Итак, я думаю, что два dicts должны использовать одну и ту же функцию хеширования, но адрес памяти переменной должен быть суммой хэш-значения и базового значения. Таким образом, две переменные будут сохранены в разных областях памяти.

+0

Существует ответ, в котором упоминается почти то же самое. Теперь он удален, поэтому вы не можете его увидеть. Спасибо, хотя +1 за аналитический ответ, но мое редактирование действительно ясное, я думаю. – gsamaras

+0

Это только адреса целых чисел '1' и' 2', независимо от того, ссылаются ли они на один или несколько диктонов или нет. (Попробуйте: поместите 'print (hex (id (1)))' в ту же программу.) –

Смежные вопросы