22.5 튜플 사용하기

변수에 값을 저장할 때 ( )(괄호)로 묶어주면 튜플이 되며 각 값은 ,(콤마)로 구분해줍니다. 또는, 괄호로 묶지 않고 값만 콤마로 구분해도 튜플이 됩니다.

  • 튜플 = (값, 값, 값)
  • 튜플 = 값, 값, 값

그럼 숫자가 5개 들어있는 튜플을 만들어보겠습니다.

>>> a = (38, 21, 53, 62, 19)
>>> a
(38, 21, 53, 62, 19)

a = (38, 21, 53, 62, 19)와 같이 변수에 괄호로 값을 저장하여 튜플을 만들었습니다(물론 숫자뿐만 아니라 문자열, 정수, 실수, 불, 리스트, 튜플, 딕셔너리, 세트, 함수 등도 넣을 수 있습니다).

튜플도 리스트와 마찬가지로 값에 접근할 때는 [ ]를 사용합니다.

  • 튜플[인덱스]
>>> a = (38, 21, 53, 62, 19)
>>> a[0]
38
>>> a[2]
53
>>> a[4]
19

하지만 튜플은 리스트와는 달리 요소의 값을 변경하거나 추가할 수 없습니다.

>>> a = (38, 21, 53, 62, 19)
>>> a[0] = 10
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    a[0] = 10
TypeError: 'tuple' object does not support item assignment

a[0] = 10과 같이 튜플에 인덱스를 지정한 뒤 값을 할당하려고 하면 에러가 발생합니다. 즉, 튜플은 읽기 전용 자료형입니다.

튜플의 요소 개수를 구할 때도 len을 사용합니다. 그리고 시작 인덱스와 끝 인덱스를 활용하는 방법은 리스트와 같습니다. 이 부분은 따로 설명하지 않겠습니다.

지금까지 요소가 여러 개 들어있는 튜플을 만들었습니다. 그럼 요소가 한 개 들어있는 튜플은 어떻게 만들까요? 다음과 같이 값 한 개를 괄호로 묶으면 튜플이 아니라 그냥 값이 됩니다. 여기서는 그냥 정수입니다.

>>> (38)
38

요소가 한 개인 튜플을 만들 때는 ( )(괄호) 안에 값 한 개를 넣고 ,(콤마)를 붙입니다. 또는, 괄호로 묶지 않고 값 한 개에 ,를 붙여도 됩니다.

  • 튜플 = (값, )
  • 튜플 = 값,
>>> (38, )
(38,)
>>> 38,
(38,)

튜플은 요소를 변경하거나 추가할 수도 없는데 값 한 개짜리 튜플은 왜 필요할까요? 나중에 함수(클래스)를 사용하다 보면 값이 아닌 튜플을 넣어야 할 경우가 생깁니다. 이때 값은 한 개지만 튜플을 넣어야 할 때 (값, )과 같은 형식을 사용해야 합니다.

참고로 a = () 또는, a = tuple()로 빈 튜플을 만들 수 있습니다. 빈 튜플은 쓸모가 없을 것 같지만 함수(클래스)에 튜플을 넣어야 할 때 사용합니다. 즉, 넣을 값은 없지만 튜플을 넣어야 할 때 ()와 같이 사용합니다.

이번에는 tuple을 사용하여 튜플을 만들어보겠습니다.

  • 튜플 = tuple(리스트) 또는 튜플 = tuple(list())
  • 튜플 = tuple(range(횟수))
  • 튜플 = tuple(range(시작, 끝))
  • 튜플 = tuple(range(시작, 끝, 증가폭))
>>> a = tuple([1, 2, 3])
>>> a
(1, 2, 3)
>>> b = tuple(range(10))
>>> b
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
>>> c = tuple(range(10, 0, -1))
>>> c
(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
>>> d = tuple(range(5, 12))
>>> d
(5, 6, 7, 8, 9, 10, 11)
>>> e = tuple(range(10, 20, 2))
>>> e
(10, 12, 14, 16, 18)

tuple([1, 2, 3])와 같이 tuple에 리스트를 바로 넣어도 되고, range를 사용해도 됩니다. 물론 range의 기능을 활용하여 특정 범위의 숫자를 넣거나 숫자의 순서를 역순으로 넣을 수도 있습니다.

그럼 list에 튜플을 넣으면 어떻게 될까요?

>>> list((1, 2, 3))
[1, 2, 3]
>>> list(tuple(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

list에 튜플을 넣더라도 list를 사용했으므로 최종 결과는 리스트입니다.

지금까지 리스트와 튜플의 다양한 사용 방법에 대해 알아보았습니다. 리스트와 튜플에서 가장 중요한 부분은 인덱스가 0부터 시작한다는 점입니다. 꼭 기억해두세요. 그리고 리스트(튜플)의 길이를 구하는 방법, 범위로 접근할 때 음수를 사용하는 방법, 끝 인덱스를 생략하는 방법은 자주 사용하므로 익혀 두는 것이 좋습니다.

참고 | 리스트와 튜플로 변수 만들기

리스트와 튜플을 사용하면 변수 여러 개를 한 번에 만들 수 있습니다. 이때 변수의 개수와 리스트(튜플)의 요소 개수는 같아야 합니다.

>>> a, b, c = [1, 2, 3]
>>>print(a, b, c)
1 2 3
>>> d, e, f = (4, 5, 6)
>>> print(d, e, f)
4 5 6

리스트와 튜플 변수로도 변수 여러 개를 만들 수 있습니다. 다음과 같이 리스트와 튜플의 요소를 변수 여러 개에 할당하는 것을 리스트 언패킹(list unpacking), 튜플 언패킹(tuple unpacking)이라고 합니다.

>>> x = [1, 2, 3]
>>> a, b, c = x
>>> print(a, b, c)
1 2 3
>>> y = (4, 5, 6)
>>> d, e, f = y
>>> print(d, e, f)
4 5 6

그리고 리스트 패킹(list packing)과 튜플 패킹(tuple packing)은 변수에 리스트 또는 튜플을 할당하는 과정을 뜻합니다.

a = [1, 2, 3]    # 리스트 패킹
b = (1, 2, 3)    # 튜플 패킹
c = 1, 2, 3      # 튜플 패킹