파이썬은 call by reference일까? call by value일까?
아니 그보다 먼저 call by reference와 call by value는 뭐야?
함수의 인자 전달 방식
- 두 방식은 함수의 인자 전달 방식이다. 즉, 함수에서 인자를 불러올 때 어떻게 그 값을 호출하는지 그 방법에 대한 것이다.
Call by value : 변수의 복사값을 전달하는 방식
- 함수의 인자를 받을 때, 변수에 담긴 값을 Stack에 복사해서 넘겨준다.
- 따라서 함수 내에서 해당 인자를 바꾸었다고 해도 원본 변수 a는 변하지 않는다.
- 예시 : func1(A)에서 A는 A자체(주소값)가 아니라 a의 레플리카(복사값)이다.
- 장점 : 원본을 건드리지 않아서 안전하다.
- 단점 : 함수의 사용으로 해당 전역변수를 바꾸고 싶을 때는 리턴 값을 다시 전역 변수로 집어 넣어야 해서 번거롭고 추가시간이 발생한다.
a = 1
print(f'global : {a}')
def func1(a):
a += 1
return a
print(f'local : {func1(a)}')
print(f'global : {a}')
global : 1
local : 2
global : 1
Call by reference : 변수의 주소값을 전달하는 방식
- 함수의 인자를 받을 때, 변수가 가리키는 주소값을 전달한다.
- 따라서 함수 내에서 해당인자를 조작하면 원본 변수의 주소 값을 타고 들어가 해당 값 자체가 변하게 된다.
- 예시 : func2(B)에서 B는 B자체(주소값)이다.
- 장점 : 전역 변수를 즉각적으로 변경 가능하다.
- 단점 : 부주의하면 변수조작을 잘못해서 프로그램이 잘 작동하지 않는다.
b = 10
print(f'global : {b}')
def func2(b):
b += 1
return b
print(f'local : {func2(b)}')
print(f'global : {b}')
global : 10
local : 11
global : 11
파이썬은 Call by reference? Call by value?
- 공식문서에 따르면 둘 다 아니다.
- 파이썬은 Call by assignment(Call by object-reference)이다.
Call by assignment
- Immutable Object인 경우에는 Call by value형식으로 변수를 핸들링하고,
- Mutable Object인 경우에는 Call by reference형식으로 변수르 핸들링 한다.
❓Immutable vs Mutable
- Immutable : tuple, str, int 등 불가변적인 포맷의 자료형
- Mutable : list, set, dictionary 등 가변적인 포맷의 자료형
⭐️ 한 줄 정리
- 파이썬의 함수 인자 호출 방식은 인자로 받는 객체의 자료형에 따라서 다르다!