본문 바로가기
인간은 어떻게 배울까

[Python] 파이썬이 함수의 매개변수에 값을 전달하는 방식

by 개발하는 아인 2023. 7. 15.

함수의 매개변수에 값을 전달하는 데는 두가지 방식이 있다.

 

첫째 pass by value, 값에 의한 전달.

def test(a):
    return a * 10

x = 1
test(x)

이런 함수 실행문이 있다고 할 때, x값 자체를 복사해서 a에게 넘기는 방식이 '값에 의한 전달'이다.

이 방식으로는 위 함수를 실행해도 x는 여전히 1이다. x 값 자체는 변경되지 않는다.

 

 

두번째 pass by reference, 참조에 의한 전달이 있는데,

위와 동일한 함수에서 x 에 저장된 값메모리 주소를 전달한다.

그럼 위에서 매개변수 a도 x와 동일한 메모리 영역을 사용하기 때문에, 함수를 실행하여 a값을 바꾸면 x값도 바뀐다.

 

파이썬은 이 참조에 의한 전달방식을 택하고 있다.

 

 

 

But, 변수의 자료형에 따라 다르다.

정수, 부동소수, 문자열, 튜플 등은 함수에 전달해서 값을 변경도 원본은 그대로다.

 

그러나 리스트, 딕셔너리, 집합 자료형은 함수에 전달되면 메모리 영역을 공유하는 것이기 때문에

함수로 값을 바꾸면 원본도 바뀐다.

아래 코드를 실행해보면 쉽게 알 수 있다.

 

코드1) 정수 (원본 변경 X)

def test(a, b):
    a = a * 10
    b = b * 100
    print("a:", a, "/ b:", b)

x = 0
y = 1
test(x, y)

print("x:", x, "/ y:", y)

========== 결과 ==========
a: 0 / b: 100
x: 0 / y: 1

위 test함수에 x(0), y(1) 값들을 전달하였다.

함수를 실행시킨 후에도 x와 y의 값은 변함이 없다. 

 

 

코드2) 리스트 (원본 변경 O)

def test(a):
    a[1] = "Hello!"
    return a

x = [1, 2, 3]
print('함수 실행 전:', x)

test(x)
print('함수 실행 후:', x)

========== 결과 ==========
함수 실행 전: [1, 2, 3]
함수 실행 후: [1, 'Hello!', 3]

x는 본래 [1, 2, 3] 이었으나 함수에 전달하고 난 후 함수에서는 전달받은 a를 변경했을 뿐이지만, x도 영향을 받아 바뀌는 것을 볼 수 있다.

 

 

이렇게 함수에 매개변수로 전달했을 때 함수실행 결과에 영향을 받는 자료형을 '가변형(mutable type)' 이라고 하며

함수실행 결과에 바뀌지 않는 자료형을 '불변형(immutable type)'이라고 한다.