Re: 26.1 세트 질문
, 도장_ 관리자님이 작성본문 설명에 있지만 세트는 중복을 허용하지 않습니다.
딕셔너리는 반드시
키:값
형태입니다.
코드를 실습한 결과를 있는 그대로 믿어서는 안 됩니다. 초보자가 자주 하는 실수입니다.
{8, 16, 24}는 순서가 보존되고, {24, 16, 8}도 순서가 보존됩니다.
그러나 {1, 2, 3}과 {3, 2, 1}은 순서가 보존되지 않습니다. {3, 2, 1}은 {1, 2, 3}이 됩니다.
내부적으로는 값을 저장할 때 사용하는 해시 값 때문에 그렇습니다.
파이썬을 구현한 C 언어 소스 코드를 직접 열어봐야 하고 구현을 이해해야 하겠지만, 간단히 확인할 수 있습니다.
hash() 함수로는 알 수 없으나 bin() 함수로 2진수를 출력해보면 알 수 있습니다.
파이썬은 세트에 저장할 때 마지막 3비트를 사용합니다.
8, 16, 24는 마지막 3비트가 000으로 같습니다. 이들 세 숫자의 마지막 3비트를 해시 값으로 사용하는데 이 값이 같습니다.
파이썬이 항상 마지막 3비트를 해시 값으로 사용하는 것은 아닙니다. 세트의 크기가 커지면 해시로 사용하는 마지막 N 비트(last N bits)의 개수도 바뀝니다.
8, 16, 24는 해시 값 충돌이 일어나기 때문에 값을 삽입할 때 다른 자리를 차지하게 됩니다. 그게 순서가 그대로 유지되는 것처럼 보이는 이유입니다.
1, 2, 3은 해시 값 출동이 일어나지 않습니다. 해시 값 충돌이 발생하지 않으니 각각의 숫자는 각각의 자리에 첫 번째로 들어가게 됩니다. 이렇게 정해진 방의 순서대로 출력하기 때문에 삽입을 3, 2, 1로 해도 출력은 1, 2, 3이 됩니다.
2, 3, 1로 바꿔도 출력하면 1, 2, 3이 됩니다.
세트는 순서를 보존하지 않습니다.