프로그래밍백엔드 개발자

파이썬에서 매개변수 전달 메커니즘은 어떻게 작동합니까 (call by object reference / call by sharing)? 변경 가능한 및 변경 불가능한 유형에 미치는 영향과 예기치 않은 변경을 피하는 방법은 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

파이썬에서는 매개변수가 '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에서 입력 데이터를 필터링하기 위해 개발자는 매개변수 사전의 복사본을 만들기를 잊어버렸고, 검증 중 값이 "사라지는" 일이 발생했습니다 — 매개변수가 원래 객체에서 삭제되어 후속 요청의 논리를 깨뜨렸습니다.