Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 인수는 값으로 전달될까요, 참조로 전달될까요?

파이썬의 인수 전달 방식: 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)에서 수정하기 때문에 원본에도 영향을 미칩니다.

반면 정수나 문자열 같은 불변 객체는 값을 직접 변경할 수 없습니다. 따라서 함수 내에서 새로운 값을 할당하면 해당 지역 변수만 새로운 객체를 가리키게 되어, 함수 외부의 원본 값에는 아무런 영향을 주지 않습니다. 이것이 불변 객체를 전달할 때 값에 의한 호출처럼 보이는 이유입니다.