본문 바로가기

파이썬/2. 파이썬 심화

파이썬 함수 호출방식

프로그래밍 언어에는 두 가지 매개변수 전달 방식이 있다.

 

값에 의한 호출(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