파이썬의 리스트에서 append()와 extend() 메서드는 요소를 추가하는 데 사용되지만, 근본적으로 다른 방식으로 작동합니다:
append(obj)는 하나의 요소(리스트를 포함한 어떤 객체라도)를 원래 리스트의 끝에 추가합니다.extend(iterable)는 이터러블 객체의 모든 요소를 하나씩 추가합니다(추가할 때 "펼쳐"지는 것처럼).예시:
lst = [1, 2, 3] lst.append([4, 5]) # 결과: [1, 2, 3, [4, 5]] lst = [1, 2, 3] lst.extend([4, 5]) # 결과: [1, 2, 3, 4, 5]
이러한 차이는 종종 "평평한" 리스트를 기대할 때 중첩된 리스트를 얻어 논리적 오류를 일으키는 원인이 됩니다.
list1 = [1, 2]; list2 = [3, 4]; list1.append(list2)를 하면 어떻게 되나요? list1은 어떻게 보이나요?list1.extend(list2)와는 어떻게 다릅니까?
답변:
list1.append(list2) 후 결과: [1, 2, [3, 4]] — 두 번째 리스트가 하나의 요소로 추가됨(중첩 리스트)list1.extend(list2) 후 결과: [1, 2, 3, 4] — 두 번째 리스트의 요소가 "펼쳐져"서 개별 요소로 추가됨.이야기
개발자는 여러 파일에서 파싱된 결과를 결합할 때
output.append(parsed_lines)를 사용했습니다. 그 결과 긴 평면 리스트 대신 리스트의 리스트를 얻게 되어(각 파일마다 하나의 요소) 후속 처리가 깨졌습니다 — 특히 문자열 시퀀스를 기대하는 함수들이 입력 데이터에서 오류를 발생시켰습니다.
이야기
프로젝트에서 "foo" 형태의 문자열을 추가하기 위해 extend를 사용했습니다(즉, 문자열이 이터러블로 간주됨). 이로 인해 문자열의 문자들이 리스트의 별도 요소가 되어
['f', 'o', 'o']가 되었습니다, 원하는 "foo" 대신.
이야기
JSON으로 데이터를 직렬화할 때 차이점에 대한 이해 없이 반복문에서 append/extend를 사용했습니다. 결과적으로 스키마를 위반하는 구조가 발생하여 일부 마이크로서비스가 검증 단계에서 실패하거나 비정상적으로 작동하게 되었습니다.