2.8. 튜플

튜플(tuple) 은 불변이며 순서가 있는 값의 시퀀스입니다. 일단 만들어지면 내부의 항목을 추가, 제거, 변경할 수 없습니다.

2.8.1. 튜플 만들기

괄호(또는 쉼표만)를 사용해 튜플을 만듭니다:

empty   = ()
point   = (3, 4)
triple  = 1, 2, 3                # parentheses are optional
mixed   = (1, "two", 3.14)
nested  = ((1, 2), (3, 4))

2.8.1.1. 단일 요소의 함정

값을 둘러싼 괄호는 그저 괄호일 뿐이며, 튜플을 실제로 만드는 것은 쉼표 입니다. 한 요소짜리 튜플에는 뒤에 쉼표가 필요합니다:

>>> (1)
1                                # just an int in parens
>>> (1,)
(1,)                             # a one-element tuple
>>> type((1)), type((1,))
(<class 'int'>, <class 'tuple'>)

2.8.2. 길이, 인덱싱, 슬라이싱

리스트나 문자열과 동일하게 len(), 인덱싱, 슬라이싱, in, 그리고 + / * 가 모두 같은 방식으로 작동합니다:

>>> point = (3, 4, 5)
>>> len(point)
3
>>> point[0]
3
>>> point[1:]
(4, 5)
>>> 4 in point
True
>>> (1, 2) + (3, 4)
(1, 2, 3, 4)

2.8.3. 불변성

튜플에는 append, pop, sort 나 그 밖의 어떤 제자리 메서드도 없습니다. 인덱스 할당은 TypeError 를 발생시킵니다:

>>> point = (3, 4)
>>> point[0] = 99
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item assignment

튜플을 “수정” 하려면 변경된 값으로 새 튜플을 만드세요.

2.8.4. 언패킹

튜플의 주된 강점은 언패킹 입니다. 한 문장에서 각 항목을 별개의 변수에 할당하는 것입니다.

세 요소짜리 튜플 (1, 2, 3)이 세 개의 이름 붙은 변수 x, y, z로 언패킹됩니다.

언패킹은 한 번의 할당으로 튜플의 각 요소를 이름 붙은 변수에 바인딩합니다.

>>> point = (3, 4)
>>> x, y = point
>>> x
3
>>> y
4

오른쪽은 리스트, 문자열, 함수의 반환값 등 어떤 이터러블이든 될 수 있습니다:

>>> a, b, c = "abc"
>>> a, b, c
('a', 'b', 'c')

맨 앞의 * 는 언패킹의 “나머지” 를 리스트로 모읍니다:

>>> first, *rest = [10, 20, 30, 40]
>>> first
10
>>> rest
[20, 30, 40]

2.8.5. 다중 반환값

함수는 튜플을 반환해 여러 값을 한 번에 전달할 수 있으며, 호출자는 받는 즉시 그것을 언패킹합니다:

def size_of(rect):
    return (rect[2] - rect[0], rect[3] - rect[1])

width, height = size_of((10, 20, 110, 140))
# width = 100, height = 120

return 의 괄호는 선택 사항입니다. 괄호 없는 return a, b 도 튜플입니다.

2.8.6. 튜플 대 리스트

어느 쪽을 선택할지에 대한 실용적인 지침:

  • 고정된 형태이고 흔히 이질적인 데이터에는 튜플(x, y) 점, (r, g, b) 색상, 다중 반환값, 나중에 쓰려고 묶어둔 함수 인자.

  • 가변 길이이고 흔히 동질적인 데이터에는 리스트 – 측정값 리스트, 처리할 항목 큐, 덧붙이리라 예상되는 모든 것.

튜플은 또한 해시 가능 하므로(내부의 모든 요소가 해시 가능한 한) dict 의 키로 사용할 수 있습니다.