파이썬에서 인수는 어떻게 전달될까?
파이썬은 엄밀히 말해 '값에 의한 호출(Call by Value)'도 '참조에 의한 호출(Call by Reference)'도 아닙니다. 대신 객체 참조에 의한 호출(Call by Object Reference) 방식을 사용합니다. 즉, 함수로 전달되는 것은 객체 자체가 아니라 객체를 가리키는 참조입니다.
이 때문에 리스트처럼 변경 가능한(mutable) 객체를 함수에 전달하면, 함수 내부에서 수정한 내용이 원본 변수에도 그대로 반영됩니다.
예제 코드
def modify_list(lst):
lst.append('30')
lst[0] = '10'
a = ['10', '20']
b = a # b도 같은 객체를 참조
modify_list(a)
print("b =", b)
print("a =", a)
실행 결과
b = ['10', '20'] a = ['10', '20']
결과 해설
위 실행 결과는 변수 a가 참조로 전달되었음을 보여줍니다. 함수 내부에서 리스트의 값을 변경하면, 메인 스크립트의 변수 a뿐 아니라 같은 객체를 참조하는 b의 값까지 함께 바뀝니다. 두 변수 모두 동일한 리스트 객체를 가리키고 있기 때문입니다.
주의할 점: 변경 불가능한(immutable) 객체
반면 정수, 문자열, 튜플처럼 변경 불가능한 객체를 전달하면 상황이 다릅니다. 함수 내부에서 새로운 값을 할당해도 원본 변수에는 영향을 주지 않습니다.
def change_number(n):
n = 100
x = 10
change_number(x)
print(x) # 10 그대로 출력됨
원본을 보호하고 싶다면?
함수 내부에서 데이터를 수정하더라도 원본을 유지하고 싶다면 copy() 또는 copy.deepcopy()를 사용해 복사본을 전달하면 됩니다.
def safe_modify(lst):
copied = lst.copy()
copied.append('30')
a = ['10', '20']
safe_modify(a)
print(a) # ['10', '20'] — 원본 유지
정리
- 파이썬은 객체의 참조를 함수에 전달합니다.
- 리스트·딕셔너리 등 mutable 객체는 함수 내 수정이 원본에 그대로 반영됩니다.
- 정수·문자열 등 immutable 객체는 재할당해도 원본에 영향이 없습니다.
- 원본 보호가 필요하면
copy()로 복사본을 만들어 전달하세요.