파이썬의 인수 전달 방식: Call-by-Object
파이썬은 '객체에 의한 호출(Call-by-Object)'이라는 독특한 메커니즘을 사용합니다. 이 방식은 '객체 참조에 의한 호출(Call by Object Reference)' 또는 '공유에 의한 호출(Call by Sharing)'이라고도 불립니다.
정수, 문자열, 튜플과 같은 불변(immutable) 객체를 함수에 전달하면 마치 값에 의한 호출(Call-by-value)처럼 동작합니다. 하지만 리스트나 딕셔너리 같은 가변(mutable) 객체를 전달할 때는 상황이 완전히 달라집니다.
파이썬에서 모든 매개변수(인수)는 참조로 전달됩니다. 즉, 함수 내부에서 매개변수가 참조하는 객체의 내용을 변경하면, 그 변경 사항이 함수를 호출한 영역에도 그대로 반영됩니다.
예제 코드
student={'Archana':28,'krishna':25,'Ramesh':32,'vineeth':25}
def test(student):
new={'alok':30,'Nevadan':28}
student.update(new)
print("함수 내부:",student)
return
test(student)
print("함수 외부:",student)실행 결과
함수 내부: {'Archana': 28, 'krishna': 25, 'Ramesh': 32, 'vineeth': 25, 'alok': 30, 'Nevadan': 28}
함수 외부: {'Archana': 28, 'krishna': 25, 'Ramesh': 32, 'vineeth': 25, 'alok': 30, 'Nevadan': 28}결과 분석 및 핵심 정리
위 예제에서 딕셔너리 student는 함수 안에서 update() 메서드로 수정되었고, 그 결과가 함수 밖에서도 동일하게 출력되었습니다. 이는 딕셔너리가 가변 객체이기 때문입니다. 함수에 전달된 것은 객체 자체가 아니라 객체를 가리키는 참조이며, update()는 기존 객체를 제자리(in-place)에서 수정하기 때문에 원본에도 영향을 미칩니다.
반면 정수나 문자열 같은 불변 객체는 값을 직접 변경할 수 없습니다. 따라서 함수 내에서 새로운 값을 할당하면 해당 지역 변수만 새로운 객체를 가리키게 되어, 함수 외부의 원본 값에는 아무런 영향을 주지 않습니다. 이것이 불변 객체를 전달할 때 값에 의한 호출처럼 보이는 이유입니다.