13 Security Lab

파이썬 함수 호출 시 참조 호출 방법 (Call by reference) 본문

Computer Science/Programming

파이썬 함수 호출 시 참조 호출 방법 (Call by reference)

Maj0r Tom 2017. 4. 20. 12:23

C에서는 다음과 같은 방법으로 참조 호출 방법 (Call by Reference) 를 사용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
void dataCalc(int *data)
{
    *data = *data + 1;
}
 
int main()
{
 
    int data = 1;
    dataCalc(&data);
    print ("data : %d", data);
 
}
cs

 

결과:

data : 2

 

 

하지만 파이썬에서는 명시적인  Call by Reference 가 불가 

(공식 manual에는 call by assignment)

 

넘겨지는 객체의 종류에 따라서 Call by Reference 또는 Call by Value 가 결정 됨

 

1. immutable object 

immutable object인 int, float, str, tuples 등  => 단일 값 이거나, static 속성

=> 함수 arguments로 넘어갈 땐 call by value로 넘어감 (복사). SubFunction 에서 formal parameter 값들이 아무리 바뀌어도, 원래 변수에는 영향이 없다.

 

2. mutable object 

list, dict, set 와 같이 mutable object가 argument로 넘어가면 object reference가 넘어가서 담고 있는 값을 바꿀 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def dataCalc1(data):
    data = data + 1
def dataCalc2(data):
    data[0= data[0+ 1
def main():
    data1 = 1
    data2 = [1]
    # Call by Value
    dataCalc1(data1);
    print 'data1 : ', data1
    # Call by Reference
    dataCalc2(data2);
    print 'data2 : ', data2
 
if __name__ == '__main__':
    main()
 
cs

 

 

결과 

data1 :  1

data2 :  [2]

 

 

따라서, 함수 호출 시 Call by Ref 를 사용하기 위해서는 Mutable object 형태의 객체(리스트 등)으로 넘기거나

Class의 멤버 변수로 관리하여 접근을 용이하게 하는 방법 등이 있을 듯 하다

 

 

Ref. url

http://hashcode.co.kr/questions/2313/%EB%B3%80%EC%88%98%EB%A5%BC-%EC%B0%B8%EC%A1%B0-%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

Comments