Call By Value
개념
함수에서 변수를 호출할 때 값을 직접 호출하는 방식입니다. 호출되는 순간 메모리 공간에 이를 위한 임시 공간이 생성되고 변수의 값을 복사하여 바로 전달합니다. 복사된 값은 함수 안에서 로컬 변수의 특성을 가지게 되며 함수 안에서 값이 변경되어도 외부 변수의 값은 변경되지 않습니다.
def add_int(a, b):
a += b
return a
a = 10
b = 15
sum_ab = add_int(a, b)
위와 같은 방식으로 함수를 정의했다고 생각하겠습니다. a 의 값에 b 를 더한 뒤 a 를 리턴해주는 방식으로 구성되어있는데, 단순히 a 와 b 의 값을 불러와서 함수에 사용했으므로 함수 안에서 a 가 변경되어도 변경사항이 외부의 a 에 적용되지 않습니다.
Call By Reference
개념
함수에서 변수를 호출할 때 그 값이 아닌 그 레퍼런스를 전달하는 방식입니다. 호출되는 순간 이를 위한 임시 공간이 생성되고 변수의 레퍼런스를 전달합니다. 변수가 존재하는 위치를 가르키는 방식이므로 변수에 조작을 가하는 순간 기존의 변수 또한 바뀌게 됩니다.
def add_int(num_list):
num_list[0] += num_list[1]
return num_list[0]
num_list = [10, 15]
sum_ab = add_int(num_list)
위와 같은 식으로 함수를 구성할 시 리스트 안의 값이 변경되면 그 변경사항이 그대로 기존의 리스트에도 적용됩니다.
같은 함수를 리스트로 구성했는지 변수들로 구성했는지만 다른데 왜 결과가 다른가 싶겠지만 이는 파이썬의 동작과정 때문입니다. 파이썬은 Call By Assignment 라는 방식으로 인자를 전달하는데 이 방식은 mutable 한 오브젝트(List, Dict, Set ..), 즉 변경할 수 있는 객체는 Call By Reference 의 방식으로 취급하고 immutable 한 오브젝트(Int, Float, String, Tuple), 즉 변경할 수 없는 객체는 Call By Value 방식으로 취급하기 때문입니다.
'Computer Science > Common' 카테고리의 다른 글
동기 Vs 비동기 (1) | 2023.11.01 |
---|---|
아스키 코드 Vs 유니코드 Vs UTF-8 (0) | 2023.10.31 |
메모리 구조 (0) | 2023.10.29 |
RESTful api (0) | 2023.10.28 |
프레임워크 Vs 라이브러리 (0) | 2023.10.27 |