파이썬에서는 매개변수가 'call by object reference' (또는 'call by sharing') 원칙에 따라 전달됩니다. 이는 함수가 객체에 대한 참조를 받으며, 객체 자체가 아니라는 것을 의미합니다. 객체가 변경 가능한(mutable) 경우 함수 내에서 그 내용을 변경할 수 있으며, 변경 사항은 외부 변수에 반영됩니다. 변경 불가능한(immutable) 객체의 경우(예: 숫자나 문자열), 함수 내에서의 변경은 새로운 객체를 생성하여 원래 객체에 영향을 미치지 않습니다.
변경 가능한 객체의 예:
def add_value(lst): lst.append(42) nums = [1, 2, 3] add_value(nums) print(nums) # [1, 2, 3, 42]
변경 불가능한 객체의 경우:
def add_value(num): num += 10 x = 5 add_value(x) print(x) # 5
질문: "파이썬에서 변수를 함수에 참조에 의해 전달합니까, 아니면 값에 의해 전달합니까?"
답변: 둘 다 전통적인 의미에서 아닙니다. 변수는 객체에 대한 참조를 전달하지만 변수 자체는 전달되지 않으며, 외부 변수에 대한 객체를 대체할 수 없습니다.
이야기 데이터를 파싱하기 위한 프로젝트 중 하나에서 함수가 목록을 필터링하는 데 사용되었습니다. 함수 내에서 새로운 목록이 생성되지 않고, 필터링은 원래 목록을 수정하는 방식으로 이루어졌습니다. 이로 인해 원래 데이터가 삭제되었고 — 스크립트를 여러 번 실행한 후 데이터가 더 이상 존재하지 않았습니다.
이야기 주니어 개발자는 다른 매개변수(목록)를 변경할 수 있었기 때문에 문자열도 함수 내에서 "참조를 통해" 변경할 수 있다고 믿었습니다. 결과적으로 함수 호출 후 프로그램은 예상된 변경 사항(문자열이 변경되지 않음)을 얻지 못해 이해할 수 없는 버그가 발생했습니다.
이야기 REST API에서 입력 데이터를 필터링하기 위해 개발자는 매개변수 사전의 복사본을 만들기를 잊어버렸고, 검증 중 값이 "사라지는" 일이 발생했습니다 — 매개변수가 원래 객체에서 삭제되어 후속 요청의 논리를 깨뜨렸습니다.