본문으로 바로가기
Lab

파이썬(Python) 리스트 사용법, 자주 쓰는 동작을 직접 해 보니

파이썬 3.15.0에서 파이썬 리스트의 꺼내기, 추가·삭제, 정렬, 복사 실수, 범위 밖 오류, 컴프리헨션을 한 번씩 실행한 출력을 담았습니다. Claude Code가 5.3초 만에 쓴 중복 제거 코드의 실행 결과도 확인할 수 있습니다.

·

번호가 붙은 칸에 담긴 상자들이 추가·삭제·정렬되며 움직이는 리스트 개념 그림
파이썬(Python) 리스트 사용법, 자주 쓰는 동작을 직접 해 보니 표지 삽화
하고 싶은 일쓰는 방법
만들기대괄호 안에 쉼표로 값 나열: ["사과", "바나나"]
꺼내기인덱스는 0부터: fruits[0], 마지막은 fruits[-1]
추가하기끝에 하나는 append, 여러 개는 extend, 위치 지정은 insert
지우기값 기준은 remove, 위치 기준은 pop이나 del
원본 두고 정렬sorted(nums)
복사하기a.copy() (b = a는 복사가 아님)

위 동작은 맥 한 대에서 파이썬 3.15.0으로 한 번씩 실행했습니다. 코드 단계 여섯 개 가운데 다섯 개는 종료 코드 0으로 끝났고, 없는 자리를 꺼낸 단계만 종료 코드 1로 멈췄습니다. 마지막으로 Claude Code에게 순서를 지키는 중복 제거 함수를 맡기니 5.3초 만에 끝났고, 받은 코드를 실행하자 [3, 1, 2]가 나왔어요. AI가 쓴 코드에서는 특히 b = a 대입, sort() 결과를 변수에 담는 줄, set으로 중복을 빼 순서가 깨지는 곳 세 가지를 확인하는 편이 좋습니다.

핵심 결론 먼저 보기

아래 리스트 예제는 직접 실행해 보면 코드와 출력을 이 글과 비교할 수 있습니다. Claude Code 단계는 설치와 로그인이 필요하며, 생성되는 코드와 출력은 실행마다 달라질 수 있습니다.

  • 대입(b = a)은 복사가 아닙니다. 따로 쓸 리스트는 a.copy()로 만듭니다.
  • sort()는 제자리에서 정렬하고 None을 돌려줍니다. 원본을 그대로 두려면 sorted()를 씁니다.
  • remove는 값 기준, pop은 위치 기준으로 지웁니다. pop은 지운 항목을 돌려줍니다.
  • 순서를 지키는 중복 제거는 숫자·문자열처럼 딕셔너리 키로 쓸 수 있는 항목이라면 dict.fromkeys로 할 수 있습니다. 리스트는 딕셔너리 키로 쓸 수 없으므로, 중첩 리스트처럼 리스트를 항목으로 가진 입력에는 이 방법을 그대로 쓸 수 없습니다.

함께 읽을 글

리스트를 만들고 값을 꺼내는 방법

리스트는 대괄호 안에 쉼표로 값을 나열해서 만듭니다. 파이썬 자습서의 리스트 절을 보면 첫 항목이 인덱스 0이고, 음수 인덱스는 끝에서부터 세며 -1부터 시작해요.

$ python3 - <<'PY'
fruits = ["사과", "바나나", "포도", "딸기"]
print(fruits)
print(fruits[0], fruits[-1])
print(fruits[1:3])
print(len(fruits))
PY
['사과', '바나나', '포도', '딸기']
사과 딸기
['바나나', '포도']
4

그런데 왜 fruits[1:3]에서 '딸기'는 빠졌을까요? 슬라이싱은 시작 위치를 포함하고 끝 위치는 빼기 때문입니다. 그래서 1번과 2번 자리인 '바나나'와 '포도'만 나오죠. 문서에 따르면 슬라이싱은 새 리스트를 돌려주고, len은 항목 개수를 알려 줍니다.

리스트에 값을 넣고 빼는 방법

값을 넣고 빼는 방법 여섯 가지를 같은 리스트에서 차례로 실행했습니다.

$ python3 - <<'PY'
nums = [3, 1, 2]
nums.append(5); print("append:", nums)
nums.insert(0, 9); print("insert:", nums)
nums.extend([7, 8]); print("extend:", nums)
nums.remove(1); print("remove:", nums)
last = nums.pop(); print("pop:", last, nums)
del nums[0]; print("del:", nums)
PY
append: [3, 1, 2, 5]
insert: [9, 3, 1, 2, 5]
extend: [9, 3, 1, 2, 5, 7, 8]
remove: [9, 3, 2, 5, 7, 8]
pop: 8 [9, 3, 2, 5, 7]
del: [3, 2, 5, 7]

자료 구조 문서가 설명하는 뜻을 짧게 옮기면 이렇습니다.

  • append: 리스트 끝에 항목 하나를 더합니다.
  • extend: 다른 이터러블의 모든 항목을 끝에 덧붙입니다.
  • insert(0, 9): 첫 인자는 새 항목이 갖게 될 인덱스이므로, 0이면 맨 앞에 들어갑니다.
  • remove(1): 인덱스 1이 아니라 값이 1인 첫 항목을 지웁니다. 그런 값이 없으면 ValueError가 납니다.
  • pop(): 인덱스를 주지 않으면 마지막 항목을 지우고 그 값을 돌려줍니다. 위 출력에서 8이 찍힌 이유죠.
  • del nums[0]: 위치로 지우지만 pop과 달리 값을 돌려주지 않습니다. 슬라이스를 통째로 지울 수도 있어요.

이 밖에도 문서는 count, index, clear, reverse, copy를 리스트 메서드로 소개합니다. 그럼 지우는 방법 셋은 언제 어떻게 고를까요? 아래 표처럼 지우는 기준과 돌려주는 값으로 나누어 보면 쉽습니다.

remove, pop, del을 지우는 기준, 돌려주는 값, 이번 실행 결과로 비교한 표
같은 리스트에서 차례로 실행했을 때 지우는 기준과 돌려주는 값이 다릅니다.
도식출처: 근거를 바탕으로 코드가 그린 도식

정렬하면 원본이 바뀔까요?

바뀌는지는 어떤 방법으로 정렬하느냐에 따라 다릅니다. sorted는 원본을 두고 새 리스트를 돌려주고, sort는 리스트 자체를 제자리에서 정렬합니다.

$ python3 - <<'PY'
nums = [3, 10, 2, 7]
print("sorted:", sorted(nums), "원래:", nums)
nums.sort(); print("sort 뒤:", nums)
nums.sort(reverse=True); print("거꾸로:", nums)
words = ["파이썬", "AI", "리스트"]
print("길이순:", sorted(words, key=len))
PY
sorted: [2, 3, 7, 10] 원래: [3, 10, 2, 7]
sort 뒤: [2, 3, 7, 10]
거꾸로: [10, 7, 3, 2]
길이순: ['AI', '파이썬', '리스트']

reverse=True를 주면 큰 값부터 정렬되고, key=len을 주면 글자 길이를 기준으로 정렬됩니다. 길이가 같은 '파이썬'과 '리스트'는 원래 순서대로 나왔어요. 하나 더 기억할 점이 있습니다. 문서에 따르면 insert, remove, sort처럼 리스트를 고치는 메서드는 None을 돌려줍니다. 그래서 AI가 만든 코드에서 sort의 결과를 변수에 담는 줄이 보인다면, 의도한 동작인지 확인해 보세요.

복사할 때 자주 하는 실수

리스트를 다른 이름에 대입하면 복사된 걸까요? 실행해 보면 그렇지 않습니다.

$ python3 - <<'PY'
a = [1, 2, 3]
b = a
b.append(4)
print("b = a 뒤 a:", a)
c = a.copy()
c.append(5)
print("a.copy() 뒤 a:", a, "c:", c)
PY
b = a 뒤 a: [1, 2, 3, 4]
a.copy() 뒤 a: [1, 2, 3, 4] c: [1, 2, 3, 4, 5]

b에만 4를 넣었는데 a까지 바뀌었습니다. 자습서는 파이썬에서 단순 대입은 데이터를 복사하지 않고, 두 이름이 같은 리스트를 가리킨다고 설명합니다. 반면 a.copy()는 얕은 사본을 돌려주므로 c에 5를 넣어도 a는 그대로예요. 문서는 a[:]도 비슷한 사본을 만든다고 적고 있습니다.

b = a로 대입하면 a도 함께 바뀌고 a.copy()로 만들면 a가 그대로인 차이를 비교한 표
이번 실행에서 b = a로 대입한 리스트에 값을 넣자 a도 바뀌었고, a.copy()로 만든 리스트는 a에 영향을 주지 않았습니다.
도식출처: 직접 실행한 순서

예를 들어 설정값 리스트를 함수에 넘겨 고치는 코드를 AI가 썼다면, 원본을 보존해야 하는 곳에서 b = a처럼 대입만 하고 있지는 않은지 먼저 확인하는 편이 안전합니다.

없는 자리를 꺼내면 어떤 오류가 날까요?

항목이 세 개인 리스트에서 인덱스 3을 꺼내면 이렇게 됩니다. 이 단계는 종료 코드 1로 끝났습니다.

$ python3 - <<'PY'
nums = [1, 2, 3]
print(nums[3])
PY
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
IndexError: list index out of range

인덱스가 0부터 시작하니 마지막 자리는 2입니다. 문서에 따르면 pop도 리스트가 비어 있거나 인덱스가 범위를 벗어나면 같은 IndexError를 냅니다. 그래서 이 메시지가 보이면 리스트 길이와 꺼내려는 인덱스부터 비교해 보세요.

리스트 컴프리헨션으로 한 줄에 만들기

반복문으로 새 리스트를 채우는 코드는 리스트 컴프리헨션으로 짧게 쓸 수 있습니다. 문서는 흔한 용도로 각 요소에 연산을 적용한 리스트 만들기와, 조건을 만족하는 요소만 고르기를 듭니다.

$ python3 - <<'PY'
nums = [1, 2, 3, 4, 5, 6]
print([n * n for n in nums])
print([n for n in nums if n % 2 == 0])
PY
[1, 4, 9, 16, 25, 36]
[2, 4, 6]

첫 줄은 모든 수를 제곱했고, 둘째 줄은 if 조건으로 짝수만 남겼습니다. 두 경우 모두 원래 nums는 건드리지 않고 새 리스트를 만들죠.

AI에게 중복 제거를 맡기면 어떤 코드가 나올까요?

마지막으로 Claude Code 2.1.309에 --model opus를 지정하고, 순서를 지키는 중복 제거 함수를 요청했습니다. 받은 코드를 파일로 저장한 뒤 바로 실행하는 명령입니다.

$ claude --model opus -p "파이썬 리스트에서 중복을 빼되 처음 나온 순서는 지키는 함수 dedupe(items)와, [3, 1, 3, 2, 1]로 실행해 결과를 출력하는 코드만 출력해. 설명이나 코드 블록 표시는 붙이지 마." > dedupe.py && cat dedupe.py && python3 dedupe.py
def dedupe(items):
    return list(dict.fromkeys(items))

print(dedupe([3, 1, 3, 2, 1]))
[3, 1, 2]

이 단계는 5.3초 걸렸고 종료 코드는 0이었습니다. 그런데 집합(set)으로 중복을 빼면 안 될까요? 집합은 순서가 없어서, 출력하면 예상과 다른 순서로 나올 수 있습니다. 반면 딕셔너리는 키가 중복되지 않고, list(d)는 키를 넣은 순서대로 돌려줍니다. 그래서 처음 나온 3, 1, 2 순서가 그대로 남은 것이죠.

구슬이 한 줄로 체를 지나며 색마다 처음 온 구슬만 순서대로 남는 그림
중복 제거에서 처음 나온 값만 순서대로 남는 개념을 그린 그림입니다.

다만 AI가 쓰는 코드는 실행할 때마다 달라질 수 있습니다. 위 코드는 이번 한 번의 결과일 뿐이니, 받은 코드는 이번처럼 예시 입력으로 직접 실행해 출력을 확인하고 쓰세요.

측정 조건과 한계

모든 단계는 2026-10-26 22:22 KST에 새 임시 폴더에서 한 번씩만 실행했습니다. 환경은 darwin arm64 맥 한 대, Homebrew로 설치된 파이썬 한 버전, Node.js v22.23.1, Claude Code 2.1.309입니다. 코드는 단계마다 표준 입력으로 넣어 바로 실행했고, 버전 확인 결과는 이렇습니다.

$ python3 --version
Python 3.15.0
단계걸린 시간종료 코드
2~5, 7단계 (리스트 동작)0.0초0
6단계 (없는 자리 꺼내기)0.0초1
8단계 (Claude Code 중복 제거)5.3초0

한 번만 잰 값이라 걸린 시간은 참고용으로만 보세요. 특히 Claude Code 단계는 실행마다 시간도 코드도 달라질 수 있습니다. 다른 파이썬 버전이나 운영체제에서 같은 출력이 나오는지는 이 측정으로 확인하지 못했으니, 쓰는 환경에서 위 명령을 그대로 다시 실행해 비교해 보세요.

참고 자료