PyThrone
15 subscribers
12 photos
Download Telegram
Channel created
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
👍4🔥2