Python에서 pop() vs del: 동일한 결과, 완전히 다른 의도
Source: Dev.to
.pop() vs del in Python — 백만 달러 질문 💰
실제로 두 메서드 모두 리스트에서 항목을 제거하지만, 사용 철학은 다릅니다.
절대 잊지 말 것:
.pop()→ 📨 배달 기사 – 리스트에서 항목을 제거하고 그 값을 전달해 줍니다.del→ 🔥 파쇄기 – 리스트에서 항목을 제거하고 파괴합니다. 값을 다시 얻을 수 없습니다.
.pop() 상황 (가장 일반적)
시나리오
작업 스택이나 카드 덱을 처리하고 있습니다. 값을 사용해야 하기 때문에 항목을 제거합니다.
tasks = ["Wash dishes", "Study SQL", "Sleep"]
# pop()은 마지막 항목을 제거하고 반환합니다
current_task = tasks.pop()
print(f"I'm working on: {current_task}")
# Output: I'm working on: Sleep
print(tasks)
# Output: ['Wash dishes', 'Study SQL']
🔎 Note: 결과를 변수에 할당하지 않더라도 "Sleep"은 여전히 제거됩니다. pop()의 핵심은 보통 제거된 값을 활용하는 데 있습니다.
del 상황 (정밀 제거)
시나리오
인덱스로 특정 항목을 삭제하고 싶고, 그 값은 필요하지 않습니다. 그냥 사라지길 원합니다.
users = ["Admin", "Felipe", "Malicious_Hacker", "Guest"]
# 해커가 인덱스 2에 있다는 걸 압니다.
# 값은 필요 없고, 그냥 삭제하고 싶습니다.
del users[2]
print(users)
# Output: ['Admin', 'Felipe', 'Guest']
del은 값을 가져오지 않고 항목을 제거해야 할 때 빛을 발합니다. pop()이 한 번에 하나의 항목만 제거한다면, del은 리스트 전체 슬라이스까지 제거할 수 있습니다:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 인덱스 2부터 5(포함되지 않음)까지 제거
del numbers[2:5]
print(numbers)
# Output: [0, 1, 5, 6, 7, 8, 9]
같은 작업을 pop()으로 하려면 루프나 여러 번 호출해야 합니다.
pop()이 실제로 하는 일
두 단계 수동 접근을 생각해 보세요:
x = p1[len(p1) - 1] # 단계 1: 값 복사
del p1[len(p1) - 1] # 단계 2: 삭제
이것이 pop()이 내부적으로 하는 일과 동일하지만, 한 줄로 표현됩니다:
x = p1.pop() # 복사와 삭제를 동시에 수행
비교
| 연산 | 값을 반환하나요? | 제거 방식 | 슬라이스 제거? | 일반적인 사용 사례 |
|---|---|---|---|---|
list.pop(i) | ✅ 예 | 인덱스 (기본값: 마지막) | ❌ 아니오 | 스택, 큐, 요소 처리 |
del list[i] | ❌ 아니오 | 인덱스 | ✅ 예 | 데이터 정리, 범위 제거 |
list.remove(x) | ❌ 아니오 | 값 ("Felipe") | ❌ 아니오 | 인덱스를 모를 때 |