Два одинаковых элемента в множестве
Склад хранит множество артикулов SKU, которые нужно пересчитать.
Одному товару поменяли артикул, а потом добавили новый. Что выведет код?
Склад хранит множество артикулов SKU, которые нужно пересчитать.
Одному товару поменяли артикул, а потом добавили новый. Что выведет код?
class SKU: def __init__(self, code): self.code = code def __eq__(self, other): return isinstance(other, SKU) and self.code == other.code def __hash__(self): return hash(self.code) key = SKU(1001) to_recount = {key} key.code = 1002 to_recount.add(SKU(1002)) a, b = to_recount print(len(to_recount)) print(a == b)
key лежит в ячейке, выбранной по хешу 1001. Новый SKU(1002) ищется по хешу 1002 —
в другой ячейке, там пусто, поэтому множество считает его новым элементом.
В итоге в множестве два равных элемента, хотя множество для того и нужно, чтобы этого не было.
Ошибки нет, а данные испорчены. Поля, от которых зависит хеш, должны быть неизменяемыми.
Со строковыми артикулами результат был бы ещё и случайным: хеш строки меняется между запусками.