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