파이썬(Python)은 그 유용성과 간결함 덕분에 많은 개발자가 선호하는 언어입니다. 그러나 간단해 보이는 내장 함수나 문법이라도 때에 따라 미묘한 문제를 초래할 수 있습니다. 이 글에서는 자주 사용되지만 방심하기 쉬운 주요 Python 함수와 관련된 함정을 살펴보고 이를 올바르게 사용하는 방법을 안내합니다.
1. 'Mutable Default Parameters'와 관련된 함정
파이썬에서 기본값을 가지는 함수 매개변수를 설정할 때, 특히 리스트(list), 딕셔너리(dict)와 같은 '변경 가능한 객체(Mutable Object)'를 기본값으로 사용할 경우 예상치 못한 문제가 발생할 수 있습니다. 이럴 때 유의해야 할 점과 해결 방안을 아래에서 확인하세요.
주요 문제는 파이썬의 함수 기본값이 함수가 정의될 때 한 번만 생성된다는 점입니다. 이는 함수를 호출할 때마다 기본값을 공유하게 된다는 말과 같습니다. 따라서, 변경된 객체가 이후 호출에도 영향을 미칩니다.
다음은 이를 방지할 수 있는 적절한 해결 방법입니다:
- 기본값을 'None'으로 설정한 뒤, 함수 내부에서 새로운 객체를 생성하세요.
- 변경 가능한 객체가 일반적으로 사용된다면, 생성된 객체를 복사(copy)하여 분리하세요.
- 파이썬의 'copy' 또는 'deepcopy' 모듈을 활용해 더 깊은 구조적 복사를 적용하세요.
아래의 코드를 이를 효과적으로 방지하는 예제로 참고하세요:
```python def append_to_list(item, target_list=None): if target_list is None: target_list = [] target_list.append(item) return target_list result1 = append_to_list(1) result2 = append_to_list(2) print(result1) # 출력: [1] print(result2) # 출력: [2] ```다음은 위 사례를 기반으로 특정 함수 호출 결과와 해결 방법을 표로 정리한 것입니다:
| 구분 | 잘못된 사용 예제 | 올바른 사용 예제 |
|---|---|---|
| 기본값 문제 | [1, 2] 로 중첩됨 | 각 호출마다 새로운 리스트 생성 |
| 함수 결과 | 변경된 결과 공유 | 독립적으로 결과 생성 |
2. 'Map' 함수 사용 시 데이터 타입 변환
'Map' 함수는 파이썬 사용자들에게 간결하고 효율적인 데이터 변환 도구를 제공합니다. 하지만 이 함수가 반환하는 결과는 'map 객체'이고, 이를 직접적으로 처리하거나 변환하지 않으면 기능적으로 적절히 활용하기 어렵습니다.
흔히 접하는 문제 중 하나는 map 함수가 리스트(list)나 다른 자료형으로 즉시 변환되지 않는다는 점입니다. 특히 파이썬 3에서는 map 객체가 '이터레이터(iterator)'로 반환되기 때문에 반복(iteration)이 끝난 후에는 데이터가 사라질 수 있다는 점을 유의해야 합니다.
효율적으로 이를 처리하기 위한 방법은 아래와 같습니다:
- 'List' 자료형으로 명시적으로 변환하기: list(map(함수, 데이터))
- 이터레이터가 아니라 데이터를 파일이나 변수에 즉시 저장하거나 출력하기
- 데이터 처리 전 작은 규모의 테스트로 변환 결과 확인
다음은 map 함수를 다루는 예제입니다:
```python numbers = [1, 2, 3] squared_numbers = map(lambda x: x ** 2, numbers) # 리스트로 변환하지 않은 경우 print(squared_numbers) # 출력:
