프로그래밍 언어에는 두 가지 매개변수 전달 방식이 있다.
값에 의한 호출(Call by value)
- 변수를 함수로 넘기는게 아니라 변수의 값만 복사하여 함수로 넘김
- 복사된 인자는 지역변수의 특성을 갖는다.(따라서 외부 변수의 값은 변하지 않는다.)
#include<stdin.h>
void call_by_value(int a, int b) # 두 수를 서로 바꾸는 함수
{
int temp = a;
a = b;
b = temp;
}
int main(void)
{
int a = 1;
int b = 2;
call_by_value();
print("%d %d", a, b);
# 1, 2
# 두 수는 변하지 않는다.
참조에 의한 호출(Call by reference)
- 함수 호출시 변수의 레퍼런스 전달(해당 변수를 가리키는 주소)
- 인자의 값이 변경되면, 전달된 값도 변경
- C의 경우 포인터로 구현 가능
#include<stdin.h>
void call_by_refernce(int &a, int &b) # 두 수를 서로 바꾸는 함수
{
int temp = a;
a = b;
b = temp;
}
int main(void)
{
int a = 1;
int b = 2;
call_by_value();
print("%d %d", a, b);
# 2, 1
# 두 수는 서로 바뀐다.
그럼 파이썬은 어디냐?
둘다 아니다.
파이썬은 객체의 reference를 넘겨준다.
객체 참조에 의한 호출(Call by object reference)
- 공유에 의한 호출(Call by sharing)이라고도 부른다.
- 파이썬은 모든 것이 객체(object)
- 하나의 개체는 하나의 인스턴스로 존재
- 즉 a = 2 같은 경우 a에 2가 할당되는 게 아니라 2라는 인스턴스를 가리키게 되는 것
- 객체의 종류에 따라 call by reference 또는 call by value 가 결정 됨
- immutable object(int, float, str 등)일 경우 call by value로 넘어가서 값을 바꿀 수 없다.
- mutable object(list, dict, set 등)일 경우 call by reference로 넘어가서 값을 바꿀 수 있다.
def mutable(a)
a = a + 1
def immutable(a)
a[0] = a[0] + 1
x = 1 # immutable
y = [1] # mutable
immutable(x)
print(x)
# 1
mutable(y)
print(y)
# 2
'파이썬 > 2. 파이썬 심화' 카테고리의 다른 글
파이썬 게으른 연산(lazy evaluation) (0) | 2020.04.27 |
---|---|
파이썬 클로저(closure) (0) | 2020.04.23 |
파이썬 람다 함수(lambda) (0) | 2020.04.23 |
파이썬 데코레이터(Decorator) + *args, **kwargs (0) | 2020.04.23 |
파이썬 반복자와 생성자(Iterator, Generator) (0) | 2020.04.21 |