На пути к пониманию словарей

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

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

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


РЕДАКТИРОВАТЬ:

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

2 ответа

Решение

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

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

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

Я бы(...)

id (объект) -> целое число

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

Выше 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'] иметь другой адрес памяти.

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

Другие вопросы по тегам