본문으로 바로가기
TaeyoungKim.dev

파이썬 append와 extend 차이: 리스트를 추가했는데 왜 중첩될까?

파이썬작성 약 3분 읽기TaeyoungKim
LinkedInX

이벤트 이름 두 개를 목록에 더했는데 결과가 ['login', 'search', 'checkout']이 아니라 ['login', ['search', 'checkout']]이 됐다. 눈으로 보면 셋 다 있으니 넘어가기 쉽다. 하지만 문자열로 합치는 순간 TypeError가 난다. append()가 고장 난 걸까? 아니다. '한 건을 더할지, 여러 건을 펼쳐 더할지' 선택이 달랐다.

append([값1, 값2])는 왜 중첩 리스트를 만들까?

처음 목록과 새 이벤트 두 건을 준비한다. append()에는 새 이벤트 리스트 한 개를 전달한다.

python
events = ['login']
batch = ['search', 'checkout']

grouped = events.copy()
grouped.append(batch)

print(grouped)
print(len(grouped), type(grouped[1]).__name__)
text
['login', ['search', 'checkout']]
2 list

append(x)는 x 자체를 마지막 원소로 넣는다. 따라서 두 번째 원소는 문자열이 아니라 리스트다. 목록을 문자열로 합치려 하면 그 차이가 드러난다.

python
','.join(grouped)
text
TypeError: sequence item 1: expected str instance, list found

append()가 틀린 함수는 아니다. 이벤트를 묶음별로 보관하려는 의도였다면 이 중첩 구조가 오히려 맞다. 지금 필요한 것은 이벤트 이름을 한 줄로 나열한 목록이므로 다른 동작을 골라야 한다.

extend([값1, 값2])는 무엇을 다르게 추가할까?

같은 출발 목록에 이번에는 extend()를 적용한다.

python
flat = events.copy()
flat.extend(batch)

print(flat)
print(len(flat))
print(','.join(flat))
text
['login', 'search', 'checkout']
3
login,search,checkout

extend()는 전달받은 반복 가능한 값에서 원소를 하나씩 꺼내 덧붙인다. batch라는 바깥 리스트는 원소로 남지 않는다. 그림에서 왼쪽의 중첩 한 칸과 오른쪽의 나란한 두 칸을 비교해 보자.

append와 extend의 반환값은 왜 None일까?

두 메서드는 원래 리스트를 바꾸고 반환값은 None이다. 새 목록을 돌려주는 함수처럼 재할당하면 값을 잃는다.

python
ready = ['login']
returned = ready.extend(['search', 'checkout'])

print(ready)
print(returned)
text
['login', 'search', 'checkout']
None

ready = ready.extend(batch)라고 쓰면 ready가 None이 된다. 원본을 남겨야 한다면 위 예제처럼 events.copy()로 새 리스트를 만든 다음 변경하자. 복사 없이 flat = events라고만 쓰면 두 이름이 같은 리스트를 가리켜 원본도 함께 바뀐다.

extend에 문자열을 넘기면 무엇이 추가될까?

extend()가 받는 것은 꼭 리스트가 아니라 반복 가능한 값이다. 문자열도 한 글자씩 반복할 수 있으므로 예상과 다른 모양이 된다.

python
labels = ['login']
labels.extend('OK')
print(labels)
text
['login', 'O', 'K']

'OK' 한 건을 넣고 싶다면 append('OK')가 맞다. 여러 이벤트를 받는 함수라면 입력이 문자열 한 개로 들어와도 되는지 먼저 정하고, 기대하는 자료형을 경계에서 확인하자. 조용히 두 글자로 쪼개진 데이터는 오류보다 늦게 발견되기 쉽다.

핵심 요약

append(x)는 x를 한 원소로 넣고, extend(xs)는 xs의 원소들을 차례로 넣는다. 결과가 중첩됐으면 먼저 len()과 실제 원소의 자료형을 확인하자. 두 메서드는 원본을 바꾸고 None을 반환하므로 결과를 다시 변수에 넣지 않는다. 문자열처럼 의도치 않게 펼쳐질 입력도 확인하면 된다.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Python#파이썬 리스트#append#extend#중첩 리스트

함께 읽으면 좋은 글