책 26.3.3에서는
set 데이터 타입에서 pop() 함수가 임의의 요소를 삭제 한다고 되어있으나, 테스트 해본 결과 제일 먼저 insert 된 순서대로 pop 처리 합니다.
아마도 파이썬 3.7 버전으로 올라가면서 바뀐거 같은데요, 검토 부탁 드립니다.
파이썬 2.x와 파이썬 3.x, 최신 버전인 파이썬 3.7까지도 set의 pop은 랜덤한 값을 반환합니다.
파이썬 3.7 공식 문서를 보면(페이지 상단에 버전과 링크에 3.7 버전이 포함되어 있습니다)
https://docs.python.org/3.7/library/stdtypes.html#set-types-set-frozenset
Set Types — set
, frozenset
A set object is an unordered collection of distinct hashable objects.
순서 없는 컬렉션(unordered collection)으로 되어 있습니다. distinct hashtable objects로 되어 있다고 되어 있습니다. 간단히 내부에서는 해시테이블로 구현하고 있다는 뜻입니다. set에 추가되는 값에 대해 해시 값을 구해서 할당한다는 뜻입니다. 따라서 set에 많은 값이 들어 있고, 그에 따라 해시 값 충돌이 발생한다면 반환되는 값은 임의의 값이 됩니다. 예를 들어 해시 값 20에 두 개의 값이 할당되어 있다면 어떤 값이 반환될지 알 수 없습니다.공식 문서의 Set types 아래에 보면 메서드 목록이 있습니다.
-
pop
() Remove and return an arbitrary element from the set. Raises
KeyError
if the set is empty.
원소가 몇 개 없을 때 들어간 순서대로 꺼내오는 것처럼 보이는 것은 우연의 일치이므로 우연의 일치를 가정한 코드는 작성하지 않는 것이 바람직합니다.
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> i = {5,1,98,6,43,95,0}
>>> i.pop()
0
>>> print(i)
{1, 98, 5, 6, 43, 95}
IDLE 실행 결과입니다. 마지막에 넣은 0이 출력되는 것으로 보아 질문하신 insert 한순서대로 pop되지는 않는 것 같습니다.
>>> i.add(3)
>>> i.add(6)
>>> i.add(0)
>>> i.add(10)
>>> i.add(5)
>>> i.pop()
0
add 함수로 하여도 결과는 같습니다.