tg-me.com/pythrone/3
Last Update:
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
BY PyThrone
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/pythrone/3