인자를 전달하는 방식에는 기본적으로 두 가지가 있다. Call by value와 Call by reference
그리고 파이썬에서는 그 외의 방법인 Call by object reference로 인자를 전달하게 된다.
Call by value
- 함수에서 값을 복사해서 전달하는 방식으로 자바 같은 경우는 Call by value방식으로 인자를 전달한다
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int a = 3;
int b = 5;
System.out.println("a: "+a+", b :"+b);
temp(a, b);
System.out.println("a: "+a+", b :"+b);
}
static void temp(Integer first, Integer second) {
Integer temp = first;
first = second;
second = temp;
System.out.println("first: "+first+", second :"+second);
}
//출력된 값
a: 3, b :5
first: 5, second :3
a: 3, b :5
보면 알겠지만 temp 내부에서 값의 변동이 일어나도 외부의 변수 값에는 영향을 미치지 않는다
Call by reference
- call-by-reference 참조에 의한 호출방식은 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달한다. (해당 변수를 가르킨다.)
- `따라서 함수 안에서 인자의 값이 변경되면, 아규먼트로 전달된 객체의 값도 함께 변경된다.
#include <stdio.h>
void swap(int &num1, int &num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
void main()
{
int a = 20, b = 60;
swap(a, b);
printf("a: %d, b: %d", a, b);
}
#출력 된 값
a: 60
b: 20
call by object reference
- 파이썬에서는 모든 것이 객체이고, 객체에는 2가지 종류가 있다.
- immutable object
- int, float, str, tuple
- immutable 객체가 함수의 arguments로 전달되면 처음에는 call by reference로 받지만, 값이 변경되면 call by value로 동작한다.
즉 함수 내에서 formal parameter 값이 바뀌어도, actual parameter에는 영향이 없다.
- mutable object
- list, dict, set
- mutable 객체가 함수의 argument로 넘어가면 call by reference로 동작한다. 즉, object reference가 전달되어 actual parameter의 값에 영향을 미칠 수 있다.
>>> a = 1
>>> b = 2
>>>
>>> def temp(a,b):
... temp = a
... a = b
... b = temp
...
>>> a
## 스왑 하기 전 값
1
>>> b
2
>>> temp(a,b)
## 스왑 한 후의 값
>>> a
1
>>> b
2
## 함수 안에서 값을 변경한다고 해도 그대로 이다
>>> def add(a):
... a = 5
...
>>> add(a)
>>> a
1
보면 값이 달라지지 않은 것을 볼 수 있다
리스트를 함수 내에서 변경 했을 때 함수 밖의 값도 달라지는 것을 볼 수 있다.
>>> list_a = [1,2,3]
>>> def append(a):
... a.append(5)
...
##리스트의 값이 변화 한 것을 볼 수 있다.
>>> append(list_a)
>>> list_a
[1, 2, 3, 5]
리스트는 reference로 작동하여 값이 무조건 변화 할 줄 알았지만....
>>> list_a = [1,2,3]
>>> list_b = [4,5,6]
>>> def swap(a,b):
... temp = a
... a = b
... b = temp
...
##이럴수가!!! 값의 변화가 없다
>>> swap(list_a, list_b)
>>> list_a
[1, 2, 3]
>>> list_b
[4, 5, 6]
이럴수가!!!!!!!!!!!!!!!!!!!!!!!!!! 변화가 없다
mutable object는 reference 처럼 동작하여 무조건 변화하는게 아니었던가!
이 부분에 대해서 아직까지 명확한 답을 찾지는 못 해서 앞으로 공부를 하면서 더 알아가려고 한다.
참고
참조 - 생활코딩
복제 전자화된 시스템의 가장 중요한 특징은 복제다. 현실의 사물과 다르게 전자화된 시스템 위의 데이터를 복제 하는데는 비용이 거의 들지 않는다. 바로 이러한 특징이 소프트웨어를 기존의 산업과 구분하는 가장 큰 특징일 것이다. 프로그래밍에서 복제가 무엇인가를 살펴보자. package org.opentutorials.javatutorials.reference; public class ReferenceDemo1 { public static void runVal
opentutorials.org
Python 함수 인자 전달 방식, Call by object Reference
...
lee-seul.github.io