피드로 돌아가기
Dev.toBackend
원문 읽기
Python Call-by-Sharing 이해를 통한 Mutable Default Argument 메모리 누수 및 데이터 오염 방지
Python’s Silent Production Killer: Why "Pass-by-Reference" is a Lie
AI 요약
Context
변수를 메모리 공간(Box)으로 인식하는 오해로 인해 Python의 Call-by-Sharing 메커니즘을 잘못 파악한 설계 구조 분석. 함수 정의 시점에 단 한 번 생성되는 Mutable Default Argument가 전역 상태처럼 동작하며 서로 다른 요청 간 데이터가 오염되는 Ghost Bug 발생.
Technical Solution
- Variables as Sticky Notes: 변수를 객체에 부착된 레이블로 정의하여 객체 변경(Mutation)과 재할당(Rebinding)의 메모리 동작 차이 구분
- Function as Object: 함수 정의 시점에 default argument가
__defaults__튜플에 저장되는 Python 내부 동작 원리 파악 - Reference Persistence: 함수 객체가 기본 인자 리스트의 참조를 유지함으로써 Garbage Collector의 회수 대상에서 제외되는 구조 분석
- Defensive Pattern 도입:
None과 같은 Immutable 객체를 기본값으로 설정하고 함수 내부에서 신규 리스트를 인스턴스화하는 로직으로 변경 - Call-time Instantiation: 함수 호출 시마다 Heap 영역에 새로운 객체를 생성하여 요청 간 상태 격리 보장
실천 포인트
- 함수의 기본 인자로 `[]`, `{}` 등 Mutable 객체 사용 금지 - 기본값으로 `None`을 설정하고 함수 내부에서 `if items is None: items = []` 패턴 적용 - Flake8의 B006 린터 규칙 도입을 통한 Mutable Default Argument 사전 차단