일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- hex-rays
- svn update
- 포인터 매핑
- ecma
- data distribution
- TensorFlow
- error
- Injection
- Rat
- x64
- open office xml
- h5py.File
- javascript
- mock.patch
- malware
- Python
- commandline
- idapro
- NumPy Unicode Error
- idb2pat
- why error
- MySQL
- Analysis
- pytest
- ida pro
- ida
- idapython
- Ransomware
- error fix
- debugging
- Today
- Total
13 Security Lab
파이썬 함수 호출 시 참조 호출 방법 (Call by reference) 본문
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