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
Что выведет этот код?
В python циклы использует тот же scope (область видимости), в которой они объявлены и оставляют переменную после себя.
Почему не 0 и не 7?
Не 7, потому что range(stop) не включая stop, т.е. дойдет до 7-1 = 6.
Не 0, потому что цикл полностью отработал, т.е. дошел до 6.
Поэтому ответ 6.
#forloop
В python циклы использует тот же scope (область видимости), в которой они объявлены и оставляют переменную после себя.
Почему не 0 и не 7?
Не 7, потому что range(stop) не включая stop, т.е. дойдет до 7-1 = 6.
Не 0, потому что цикл полностью отработал, т.е. дошел до 6.
Поэтому ответ 6.
#forloop
👍4🔥2