3
내가 정의한 클래스 중 하나는 set()
에서 동일한 객체를 필터링하는 데 사용됩니다. 하지만 예상대로 작동하지 않으므로 잘못된 점을 분명히 이해합니다.Python set() 및 __hash__ confusion
class Foo(object):
def __hash__(self):
return 7
x = set()
x.add(Foo())
assert len(x) == 1
x.add(Foo())
assert len(x) == 1 # AssertionError
집합은 하나의 요소로만 구성 될 것으로 예상되지만 두 개가 있습니다. 왜 그런가요?
그렇다면 유일한 개체 집합을 얻으려면'__eq__'을 추가로 재정의해야합니까? (내 컨텍스트에서 고유) –
그냥 편집을 보았습니다, 감사합니다! –
"해시 알고리즘은 모든 항목에 대해 고유 한 해시를 가질만큼 충분하지 않습니다. 그렇지 않으면 계산 시간이 오래 걸립니다"- 사실이 아닙니다 (예 : 파이썬의'hash (x)''x'는'int'입니다) 'x'를 반환하므로 해시 값에 충돌이 없습니다.)하지만 해시 테이블에는 현재 N 개의 버킷이 있습니다. 해시 테이블 구현에서 버킷을 선택하는 'bucket = hash_value % N'과 해시 값 X, X + N, X + 2N 등이 모두 동일한 버킷에 충돌합니다. 당신은 아마 이것을 알고 있지만, 현재의 표현은 달리 말하고 독자들에게 혼란을 줄 수 있습니다 .... –