TGViewer
PyThrone PyThrone @pythrone · 13 subscribers
Post #3 119
class Some:
def __hash__(self):
return 1

def __eq__(self, other):
return False


d = {Some() for _ in range(5)}

print(len(d))


Что выведет этот код?

Может показаться, что ответ = 1, т.к. hash любого инстанса класса Some равен 1.

1) При добавлении нового элемента в set, dict питон находит его hash(element) (если вы не знаете, что такое хэш функция и зачем она нужна, почитайте про хэш таблицы).

2) Из этого хэша определяется индекс в массиве, куда нужно вставить этот элемент.

3) Если по этому индексу ничего нет, то элемент просто вставляется.

4) А если там уже есть какой-то элемент (это коллизия), то питон уже сравнивает существуещий элемент с тем, который хотим добавить (new == old). Если они равны, то старый заменяется новым элементом.

5) В нашем случае все экземпляры Some разные, т.к.
__eq__ всегда возвращает False


Поэтому ответ 5.

#set #dict #hash
  • 🔥 3
More from @pythrone
  1. Mar 10, 2023Как можно вызывать эту функцию? Правильный ответ # 1 и # 2. arg1 - только позиционный аргу…
  2. Mar 9, 2023В данном случае будет выведено None, потому что оператор and возвращает первое ложное знач…
  3. Feb 27, 2023Что выведет этот код? Iterable - это объект по которому можно пройтись. Для питона это люб…
  4. Feb 22, 2023Что выведет этот код? Могло показаться, что выведется словарь с буквами и их повторением в…
  5. Feb 20, 2023Set - это множество, в котором элементы не имеют порядок. Т.е. порядок не гарантируется, н…
  6. Feb 16, 2023Что выведет этот код? Когда мы выполняем операции вида: left + right Вызывается метод left…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →