개발/python

파이썬 리스트와 튜플 차이 쉽게 이해하기

notebase 2026. 5. 21. 15:17

파이썬 리스트와 튜플은 여러 값을 하나로 묶어서 다룰 때 사용하는 자료형입니다. 둘 다 순서가 있지만, 값을 바꿀 수 있는지에 따라 쓰임이 달라집니다.

변수는 값 하나를 저장할 때 많이 사용합니다.

name = "철수"
age = 20

그런데 이름 5개를 저장해야 한다면 어떻게 해야 할까요?

name1 = "철수"
name2 = "영희"
name3 = "민수"
name4 = "지연"
name5 = "수진"

이렇게 변수 이름을 계속 늘리는 방식은 관리하기 어렵습니다.

이럴 때 사용하는 것이 리스트(list) 입니다.

names = ["철수", "영희", "민수", "지연", "수진"]

리스트를 사용하면 여러 값을 하나의 변수에 담아 관리할 수 있습니다.


리스트는 여러 값을 담는 자료형이다

리스트는 여러 값을 순서대로 저장하는 자료형입니다.

fruits = ["사과", "바나나", "딸기"]

위 코드에서 fruits라는 변수 안에는 세 개의 문자열이 들어 있습니다.

리스트 안에는 문자열뿐 아니라 숫자도 넣을 수 있습니다.

numbers = [10, 20, 30, 40]

서로 다른 자료형을 함께 넣는 것도 가능합니다.

user = ["철수", 20, True]

다만 초보 단계에서는 한 리스트 안에 같은 성격의 값을 넣는 방식이 이해하기 쉽습니다.

scores = [80, 90, 75]
names = ["철수", "영희", "민수"]

파이썬 리스트 만들기

리스트는 대괄호 []를 사용해서 만듭니다.

리스트이름 = [값1, 값2, 값3]

예시는 다음과 같습니다.

colors = ["red", "green", "blue"]

빈 리스트도 만들 수 있습니다.

items = []

빈 리스트는 나중에 값을 추가할 때 자주 사용합니다.

items = []

items.append("노트북")
items.append("마우스")

print(items)

실행 결과는 다음과 같습니다.

["노트북", "마우스"]

리스트에서 값 꺼내기: 인덱싱

리스트 안의 값은 순서가 있습니다.

fruits = ["사과", "바나나", "딸기"]

여기서 각각의 위치는 다음과 같습니다.

위치
사과 0
바나나 1
딸기 2

파이썬은 순서를 셀 때 0부터 시작합니다.

fruits = ["사과", "바나나", "딸기"]

print(fruits[0])
print(fruits[1])
print(fruits[2])

실행 결과는 다음과 같습니다.

사과
바나나
딸기

이처럼 리스트에서 특정 위치의 값을 가져오는 것을 인덱싱(indexing) 이라고 합니다.


음수 인덱스 사용하기

파이썬 리스트는 음수 인덱스도 사용할 수 있습니다.

fruits = ["사과", "바나나", "딸기"]

print(fruits[-1])
print(fruits[-2])

실행 결과는 다음과 같습니다.

딸기
바나나

-1은 마지막 값을 의미합니다.
-2는 뒤에서 두 번째 값을 의미합니다.

마지막 값을 가져올 때는 fruits[-1]처럼 쓰는 경우가 많습니다.


리스트 일부만 가져오기: 슬라이싱

리스트에서 일부 값만 잘라서 가져올 수도 있습니다.

이것을 슬라이싱(slicing) 이라고 합니다.

numbers = [10, 20, 30, 40, 50]

print(numbers[1:4])

실행 결과는 다음과 같습니다.

[20, 30, 40]

numbers[1:4]는 인덱스 1부터 인덱스 4 전까지 가져오라는 뜻입니다.

주의할 점은 끝 위치의 값은 포함되지 않는다는 것입니다.

numbers = [10, 20, 30, 40, 50]
# 인덱스:   0   1   2   3   4

print(numbers[1:4])

결과는 인덱스 1, 2, 3에 해당하는 값입니다.

[20, 30, 40]

처음부터 가져오고 싶다면 시작 위치를 생략할 수 있습니다.

numbers = [10, 20, 30, 40, 50]

print(numbers[:3])

실행 결과는 다음과 같습니다.

[10, 20, 30]

특정 위치부터 끝까지 가져오고 싶다면 끝 위치를 생략할 수 있습니다.

numbers = [10, 20, 30, 40, 50]

print(numbers[2:])

실행 결과는 다음과 같습니다.

[30, 40, 50]

리스트에 값 추가하기

리스트에 값을 추가할 때는 append()를 많이 사용합니다.

fruits = ["사과", "바나나"]

fruits.append("딸기")

print(fruits)

실행 결과는 다음과 같습니다.

["사과", "바나나", "딸기"]

append()는 리스트의 맨 뒤에 값을 추가합니다.

원하는 위치에 값을 넣고 싶다면 insert()를 사용할 수 있습니다.

fruits = ["사과", "딸기"]

fruits.insert(1, "바나나")

print(fruits)

실행 결과는 다음과 같습니다.

["사과", "바나나", "딸기"]

insert(1, "바나나")는 인덱스 1 위치에 "바나나"를 넣으라는 뜻입니다.


리스트 값 수정하기

리스트의 값은 나중에 바꿀 수 있습니다.

fruits = ["사과", "바나나", "딸기"]

fruits[1] = "포도"

print(fruits)

실행 결과는 다음과 같습니다.

["사과", "포도", "딸기"]

기존에 인덱스 1 위치에 있던 "바나나""포도"로 바뀌었습니다.

이처럼 리스트는 변경 가능한 자료형입니다.


리스트 값 삭제하기

리스트에서 값을 삭제하는 방법은 여러 가지가 있습니다.

가장 직관적인 방법은 remove()입니다.

fruits = ["사과", "바나나", "딸기"]

fruits.remove("바나나")

print(fruits)

실행 결과는 다음과 같습니다.

["사과", "딸기"]

remove()는 리스트에서 해당 값을 찾아 삭제합니다.

인덱스를 기준으로 삭제하고 싶다면 pop()을 사용할 수 있습니다.

fruits = ["사과", "바나나", "딸기"]

fruits.pop(1)

print(fruits)

실행 결과는 다음과 같습니다.

["사과", "딸기"]

pop(1)은 인덱스 1에 있는 값을 삭제합니다.

pop()에 아무 값도 넣지 않으면 마지막 값을 삭제합니다.

fruits = ["사과", "바나나", "딸기"]

fruits.pop()

print(fruits)

실행 결과는 다음과 같습니다.

["사과", "바나나"]

리스트 길이 확인하기

리스트에 값이 몇 개 들어 있는지 확인할 때는 len()을 사용합니다.

fruits = ["사과", "바나나", "딸기"]

print(len(fruits))

실행 결과는 다음과 같습니다.

3

len()은 리스트뿐 아니라 문자열, 튜플 등 여러 자료형에서도 사용됩니다.

text = "Python"

print(len(text))

실행 결과는 다음과 같습니다.

6

리스트 안에 값이 있는지 확인하기

리스트 안에 특정 값이 있는지 확인할 때는 in을 사용합니다.

fruits = ["사과", "바나나", "딸기"]

print("사과" in fruits)
print("포도" in fruits)

실행 결과는 다음과 같습니다.

True
False

in은 조건문과 함께 자주 사용됩니다.

fruits = ["사과", "바나나", "딸기"]

if "사과" in fruits:
    print("사과가 있습니다.")

조건문은 이후 글에서 자세히 다루겠습니다.
지금은 in을 사용하면 리스트 안에 값이 있는지 확인할 수 있다는 정도만 이해하면 됩니다.


튜플은 무엇인가?

튜플(tuple)은 리스트처럼 여러 값을 순서대로 담는 자료형입니다.

다만 튜플은 소괄호 ()를 사용합니다.

point = (10, 20)

튜플도 인덱싱이 가능합니다.

point = (10, 20)

print(point[0])
print(point[1])

실행 결과는 다음과 같습니다.

10
20

튜플도 슬라이싱할 수 있습니다.

numbers = (10, 20, 30, 40, 50)

print(numbers[1:4])

실행 결과는 다음과 같습니다.

(20, 30, 40)

여기까지 보면 리스트와 거의 비슷해 보입니다.

차이는 값을 바꿀 수 있는지에서 나옵니다.


튜플은 값을 바꿀 수 없다

리스트는 값을 수정할 수 있습니다.

fruits = ["사과", "바나나", "딸기"]

fruits[0] = "포도"

print(fruits)

실행 결과는 다음과 같습니다.

["포도", "바나나", "딸기"]

하지만 튜플은 한 번 만들면 내부 값을 바꿀 수 없습니다.

fruits = ("사과", "바나나", "딸기")

fruits[0] = "포도"

이 코드는 오류가 발생합니다.

TypeError: 'tuple' object does not support item assignment

튜플은 수정하기 어려운 리스트가 아니라, 변경할 수 없는 순서형 자료형입니다.

이 차이를 정확히 이해하는 것이 중요합니다.


리스트와 튜플의 차이

리스트와 튜플의 핵심 차이는 다음과 같습니다.

구분 리스트 튜플
기호 [] ()
값 변경 가능 불가능
값 추가 가능 불가능
값 삭제 가능 불가능
순서 있음 있음
인덱싱 가능 가능
슬라이싱 가능 가능

리스트는 값을 추가, 수정, 삭제할 수 있습니다.

numbers = [1, 2, 3]

numbers.append(4)
numbers[0] = 10

print(numbers)

실행 결과는 다음과 같습니다.

[10, 2, 3, 4]

튜플은 값을 바꿀 수 없습니다.

numbers = (1, 2, 3)

이 상태에서 numbers[0] = 10처럼 수정하려고 하면 오류가 발생합니다.


리스트를 써야 하는 경우

리스트는 값이 나중에 바뀔 가능성이 있을 때 사용합니다.

예를 들어 장바구니를 생각해볼 수 있습니다.

cart = []

cart.append("노트북")
cart.append("마우스")
cart.append("키보드")

print(cart)

실행 결과는 다음과 같습니다.

["노트북", "마우스", "키보드"]

장바구니는 상품을 추가할 수도 있고, 삭제할 수도 있습니다.
이런 데이터는 리스트가 적합합니다.

학생 점수 목록도 리스트로 다루기 좋습니다.

scores = [80, 90, 75]

scores.append(100)

print(scores)

실행 결과는 다음과 같습니다.

[80, 90, 75, 100]

값이 계속 변할 수 있다면 리스트를 사용하면 됩니다.


튜플을 써야 하는 경우

튜플은 한 번 정한 값을 바꾸지 않을 때 사용합니다.

예를 들어 좌표를 생각해볼 수 있습니다.

point = (10, 20)

요일처럼 고정된 값에도 사용할 수 있습니다.

weekdays = ("월", "화", "수", "목", "금", "토", "일")

설정값처럼 바뀌면 안 되는 데이터에도 튜플을 사용할 수 있습니다.

rgb = (255, 255, 255)

튜플을 사용하면 이 데이터는 쉽게 수정되지 않는 값이라는 의도를 코드에서 드러낼 수 있습니다.

초보 단계에서는 이렇게 판단하면 됩니다.

  • 나중에 값을 바꿀 수 있어야 한다면 리스트
  • 한 번 정한 값을 유지하고 싶다면 튜플

값 하나짜리 튜플을 만들 때 주의할 점

튜플에서 헷갈리기 쉬운 부분이 하나 있습니다.

값이 하나만 있는 튜플을 만들 때는 쉼표가 필요합니다.

a = ("사과")
b = ("사과",)

print(type(a))
print(type(b))

실행 결과는 다음과 같습니다.

<class 'str'>
<class 'tuple'>

("사과")는 튜플이 아니라 문자열입니다.
값 하나짜리 튜플은 ("사과",)처럼 쉼표를 붙여야 합니다.

숫자도 마찬가지입니다.

a = (10)
b = (10,)

print(type(a))
print(type(b))

실행 결과는 다음과 같습니다.

<class 'int'>
<class 'tuple'>

초보자에게는 자주 필요한 문법은 아니지만, 튜플을 공부할 때 한 번은 알아두는 것이 좋습니다.


리스트와 문자열은 닮은 점이 있다

이전 글에서 문자열을 다뤘다면 리스트가 조금 더 쉽게 느껴질 수 있습니다.

문자열도 인덱싱할 수 있습니다.

text = "Python"

print(text[0])
print(text[1])

실행 결과는 다음과 같습니다.

P
y

문자열도 슬라이싱할 수 있습니다.

text = "Python"

print(text[0:3])

실행 결과는 다음과 같습니다.

Pyt

리스트도 마찬가지입니다.

items = ["P", "y", "t", "h", "o", "n"]

print(items[0])
print(items[0:3])

실행 결과는 다음과 같습니다.

P
['P', 'y', 't']

문자열과 리스트는 둘 다 순서가 있는 자료형입니다.
그래서 인덱싱과 슬라이싱 방식이 비슷합니다.

다만 문자열은 문자들이 이어진 자료형이고, 리스트는 여러 값을 담을 수 있는 자료형입니다.


자주 발생하는 오류

인덱스 범위를 벗어나는 경우

리스트에 없는 위치를 가져오려고 하면 오류가 발생합니다.

fruits = ["사과", "바나나", "딸기"]

print(fruits[3])

이 코드는 오류가 발생합니다.

IndexError: list index out of range

리스트의 마지막 인덱스는 값의 개수보다 1 작습니다.

fruits = ["사과", "바나나", "딸기"]

위 리스트에는 값이 3개 있습니다.

하지만 인덱스는 다음과 같습니다.

0, 1, 2

따라서 fruits[3]은 존재하지 않습니다.


remove()로 없는 값을 삭제하려는 경우

remove()는 리스트 안에 있는 값을 삭제합니다.
그런데 없는 값을 삭제하려고 하면 오류가 발생합니다.

fruits = ["사과", "바나나", "딸기"]

fruits.remove("포도")

오류는 다음과 같습니다.

ValueError: list.remove(x): x not in list

삭제하기 전에 값이 있는지 확인하면 오류를 줄일 수 있습니다.

fruits = ["사과", "바나나", "딸기"]

if "포도" in fruits:
    fruits.remove("포도")

아직 조건문을 자세히 배우지 않았다면 이런 방식이 있다는 정도만 봐도 충분합니다.


리스트와 튜플 예제 정리

간단한 예제로 다시 정리해보겠습니다.

fruits = ["사과", "바나나", "딸기"]

fruits.append("포도")
fruits[1] = "수박"
fruits.remove("딸기")

print(fruits)

실행 결과는 다음과 같습니다.

["사과", "수박", "포도"]

리스트는 값을 추가하고, 수정하고, 삭제할 수 있습니다.

이번에는 튜플입니다.

colors = ("red", "green", "blue")

print(colors[0])
print(colors[1:3])

실행 결과는 다음과 같습니다.

red
('green', 'blue')

튜플은 인덱싱과 슬라이싱은 가능하지만, 값을 직접 수정할 수는 없습니다.


정리

리스트와 튜플은 여러 값을 하나로 묶어서 다룰 때 사용하는 자료형입니다.

리스트는 대괄호 []를 사용합니다.

fruits = ["사과", "바나나", "딸기"]

튜플은 소괄호 ()를 사용합니다.

fruits = ("사과", "바나나", "딸기")

두 자료형 모두 순서가 있습니다.
그래서 인덱싱과 슬라이싱을 사용할 수 있습니다.

차이는 값을 바꿀 수 있는지입니다.

리스트는 값을 추가, 수정, 삭제할 수 있습니다.
튜플은 한 번 만들면 내부 값을 바꿀 수 없습니다.

초보 단계에서는 이렇게 기억하면 됩니다.

리스트: 나중에 바뀔 수 있는 값들의 묶음
튜플: 바뀌지 않아야 하는 값들의 묶음

다음 글에서는 이름과 값이 짝을 이루는 자료형인 딕셔너리(dictionary) 와, 중복을 제거할 때 자주 사용하는 집합(set) 을 알아보겠습니다.