일반적으로 사용되는 함수 인자 전달 방식은 call by value, call by reference 두 가지이다.
call by value는 함수의 인자를 받을 때, 변수에 담긴 값 자체를 복사하여 넘겨주므로 함수 내에서 해당 인자를 조작하여 바꿔도 원본은 변하지 않는다. 원본을 건드리지 않아 안전하지만, 함수의 사용으로 해당 전역 변수를 바꾸고자 하는 경우에는 리턴 값을 다시 전역 변수로 집어넣어야 하는 번거로움이 있을 수 있다.
call by reference는 함수의 인자를 받을 때, 변수가 가리키는 주소 값을 전달함으로써, 함수 내에서 해당 인자를 조작하면 원본 변수의 주소 값으로 타고 들어가 해당 값 자체를 변경시킨다.
그렇다면 파이썬은 call by value일까? call by reference일까?
파이썬은 passed by assignment로 어떤 값을 전달하느냐에 따라 call by value가 될 수도 call by reference가 될 수도 있다.
파이썬의 자료형에는 크게 mutable과 immutable이 있고, mutable 타입의 객체를 넘기면 call by reference, immutable 타입의 객체를 넘기면 call by value가 된다.
예를 들어보면 다음과 같다.
num = 2
sample_list = [1, 2, 3, 4]
def passed_by_assignment(parm_num, parm_list):
parm_num = 3
parm_list[0] = 5
print(parm_num)
print(parm_list)
print(num) # 2
print(sample_list) # [1, 2, 3, 4]
passed_by_assignment(num, sample_list)
# 3
# [5, 2, 3, 4]
print(num) # 2
print(sample_list) # [5, 2, 3, 4]
파이썬에서는 모든 것이 객체이기 때문에 할당되는 것에 따라 전달 방식이 달라질 수 있다.
위의 예제에서 int 타입의 변수인 num을 함수의 인자 값으로 넘기면 이 객체는 immutable하기 때문에 함수 안에서 새로운 값을 생성한다. 이는 마치 call by value처럼 보이게 되고, sample_list와 같이 mutable한 객체를 넘기게 되면 새로운 값을 만들 필요 없이 reference만 유지되기 때문에 call by reference 처럼 보이게 되는 것이다.
코딩 시 이러한 부분을 잘 생각하여, mutable한 객체를 함수의 인자로 넘겼다가 예상치 못한 결과를 만나는 일이 없도록 하자!
'🐍Python | Django' 카테고리의 다른 글
[Python] Python의 메모리 관리 (0) | 2022.05.03 |
---|---|
[Django] Django MTV (0) | 2022.04.29 |
[Python] 메타클래스(MetaClass) (0) | 2022.04.27 |
[Python] main 함수 (0) | 2022.04.26 |
[Python] Class와 상속(Inheritance) (0) | 2022.04.19 |