Python 세트에 순서가 있는 것처럼 보이는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-14 22:27:02
원래의
565명이 탐색했습니다.

Why Do Python Sets Appear to Have an Order?

Python 세트의 명백한 순서 이해

Python 세트는 본질적으로 순서가 없지만 겉보기에 일관성 있는 표시 순서는 의문을 제기했습니다. 이 문서에서는 이러한 명백한 순서 뒤에 숨은 메커니즘을 살펴봅니다.

해싱 및 메모리 배치

Python은 해싱을 사용하여 집합에 있는 요소의 메모리 배치를 결정합니다. 각 요소의 해시가 계산되고 마지막 N 비트(세트 크기에 따라 결정됨)가 배열 인덱스로 사용됩니다. 이는 특정 해시 값을 가진 요소가 특정 메모리 위치에 있게 되는 이유를 설명합니다.

충돌 해결

해시 충돌이 발생하면(두 요소가 동일한 해시를 가질 때) 충돌 해결 알고리즘이 시작됩니다. 이 알고리즘은 어떤 요소가 "최상의" 메모리 위치를 차지하는지 결정합니다. 해결 프로세스는 세트 내의 요소 순서를 부분적으로 결정합니다.

삽입 순서(Python 3.6 이상)

CPython 3.6부터 사전(세트 아님)이 확보되었습니다. 반복을 위해 삽입 순서를 유지하는 기능. 이 기능을 사용하면 해시가 충돌하더라도 삽입된 순서와 동일한 순서로 요소를 반복할 수 있습니다. 그러나 이 게재 신청서 보존은 현재 세트로 확장되지 않습니다.

다음 예를 고려하세요.

set_1 = set([5, 2, 7, 2, 1, 88])
set_2 = set([5, 2, 7, 2, 1, 88])
print(set_1)  # prints set([88, 1, 2, 5, 7])
print(set_2)  # prints set([88, 1, 2, 5, 7])
로그인 후 복사

이 경우 일관된 순서는 모든 요소의 해시 값이 동일하기 때문입니다. 해시 충돌은 동일한 충돌 해결로 이어지며 동일한 순서로 이어집니다.

그러나 이 순서는 보장되지 않으며 요소가 다른 순서로 삽입되거나 해시가 변경되는 경우 변경될 수 있습니다. 예:

list1 = [8, 16, 24]
set(list1)        # prints set([8, 16, 24])
list2 = [24, 16, 8]
set(list2)        # prints set([24, 16, 8])
로그인 후 복사

두 번째 세트의 역순 정렬은 입력 목록 재정렬로 인해 충돌 해결 결과가 달라진 결과입니다.

결론

Python 세트의 명백한 순서는 해싱, 메모리 배치 및 충돌 해결의 조합에서 발생합니다. 삽입 순서가 보장되지는 않지만 해시 일관성 및 충돌 해결 결과로 인해 일부 시나리오에서 나타날 수 있습니다.

위 내용은 Python 세트에 순서가 있는 것처럼 보이는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿