Какими могут быть ключи словарей и причем тут hash()?

Поділитися
Вставка
  • Опубліковано 16 вер 2024
  • Если спросить начинающего разработчика, какие типы данных могут быть ключами словарей, ответ будет "строки". Более опытный разработчик скажет, что ключами словаря может быть любой иммутабельный тип данных. Но это тоже не совсем правильно. Давайте разбираться!
    Я в Telegram - t.me/tricky_py...
    Канал создан при поддержке сообщества Moscow Python.
    Наш UA-cam-канал - / @moscowdjangoru
    Курсы Learn Python - learn.python.ru/

КОМЕНТАРІ • 18

  • @zakchips
    @zakchips 2 роки тому

    Спасибо за очень интересный пример работы с csv files.

  • @vlgvadim3707
    @vlgvadim3707 Рік тому

    Просто прекрасно!!!

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov 10 місяців тому

    Благодарю!

  • @Shadowfight-z5f
    @Shadowfight-z5f Рік тому +4

    Автор, ну как тут дизлайк то не влепить?
    Почему абсолютно все "учителя" объясняют все через пень колоду?
    3:13 Если ключи словаря преобразуются в набор хешей, тогда почему мы можем создавать словарь типа
    {"":"Empty string",0:"Zero"}
    У пустой строки и целого числа ноль одинаковый хеш, однако ключи разные.
    Почему ты нифига не объяснил, что во время создания словаря производится не только запуск функции
    hash() (или метода __hash__ в пользовательском классе), но и функция сравнения (__eq__ в пользовательском классе), но только в случае если хеши равны?
    0:26 Атрибут __hash__ есть у всех, ты не поверишь. Он есть у класса object, от которого унаследованны все остальные. Только этот атрибут может быть перегружен и иметь значение None, например у списка.
    Представь себе, буду я проверять объект на возможность использования в качестве ключа, напишу вроде
    hasattr( MyObject, __hash__), он мне вернет True, и я смачно сяду в лужу.
    Потом вообще началась какая-то дичь. Какой то нафиг нам не нужный модуль csv, и больше ни слова про хеш.
    Кстати, изменяемые типы данных тоже могут быть ключами словаря. Например это функции, или пользовательские классы, которые в качестве атрибута могут иметь список.
    А вот использовать в словаре например булевы значения и цифры надо осторожно. Ибо True преобразуется в 1, а False - в 0.
    В общем, изучать програмирование можно только методом научного тыка.

  • @RockstarAlexander
    @RockstarAlexander 3 роки тому

    👍👍👍

  • @avazart614
    @avazart614 3 роки тому +6

    Может ли быть такое что тип хешируемый, но мутабельный? Что тогда?
    Мне к примеру не совсем понятно требование к немутабельности. Возникают вопросы при создании пользовательских классов, что внем нужно определять итп. и как это согласуется с немутабельностью

    • @Хитрыйпитон
      @Хитрыйпитон  3 роки тому +5

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

    • @Игорь-ч6ф3и
      @Игорь-ч6ф3и 3 роки тому +5

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

  • @VGCor
    @VGCor 2 роки тому +1

    Интересно, какими могут быть значения множеств и причём там hash? Не нашёл информации об устройстве set в python.

    • @user-kt2vw4iv6y
      @user-kt2vw4iv6y 2 роки тому

      Тоже самое, все элементы множества должны быть хэшируемыми

    • @VGCor
      @VGCor 2 роки тому

      @@user-kt2vw4iv6y это понятно, но как именно setы устроены не понятно.

  • @АлексейСогласен

    У списков, словарей, множеств и bytearray также есть методы __hash__ и __eq__ однако это не делает их хешируемыми
    Правильный ответ: Ключом в словаре может быть любой не изменяемый тип данных

    • @npc-r390
      @npc-r390 Рік тому

      hash([1,2,3]) будет ошибка TypeError: unhashable type: 'list'
      поэтому не у всех есть hash

  • @palms1990
    @palms1990 3 роки тому +3

    можно без импорта воспользоваться встроенным методом setdefault.
    dict.setdefault(key, default).append(value)

  • @danildvorchyk5533
    @danildvorchyk5533 3 роки тому +1

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

    • @ДенисМедведев-о7д
      @ДенисМедведев-о7д 7 місяців тому

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

  • @snoop9860
    @snoop9860 3 роки тому

    +1

  • @user-nu3ot7td1j
    @user-nu3ot7td1j Рік тому

    Какими могут быть ключи словарей и причем тут hash()? на вопрос ответа в видео нет