Call By Object Reference
- Call By Value : 함수에 인자를 넘길 때 값만 넘김
- Call By Reference : 메모리 주소를 넘김, 함수 내에 인자 값 변경 시 호출자의 값도 변경
- Call By Object Reference
- Python은 객체의 주소가 함수로 전달되는 방식
- 전달된 객체를 참조하여 변경 시 호출자에게 영향을 줌 (여기까지는 Call By Reference와 같음)
- but, 새로운 객체를 만들 경우 호출자에게 영향을 주지 않음
코드 예시
def func(b):
b += 10
print(b)
a = 10
func(a)
print(a)
위 코드를 예시로 Call by Value, Reference, Object Reference를 설명해보자.
위 코드가 Call By Value에서 작동한다면,
func() 함수 인자에 a의 값만 전달되면서, 함수 실행 후 a의 값은 변하지 않고 함수 내의 b의 값만 +=10.
Call By Reference에서 작동한다면,
func() 함수 인자에 a의 주소 값이 전달, 함수 내의 변수 b에 10을 더했으므로 주소 값으로 연결된 a도 변함.
Python에서는 위 둘의 방식이 아닌 Call By Object Reference라는 방식을 사용한다.
위 2가지 상황의 경우 a, b는 각각 값을 저장하는 변수, 10은 값이지만 Python은 a, b, 10 모두 각각의 인스턴스(객체)가 된다.
그러므로 Python에서는 a = 10이라는 코드는 a라는 변수 객체가 10을 저장한다는 뜻이 아니라, a라는 변수 객체가 10이라는 인스턴스를 가리키고 있다는 것을 의미한다.
- a = 10, 인스턴스 a가 인스턴스 10을 가리킴
- func() 호출에 의해 인스턴스 b가 a가 가리키는 10을 가리킴
- b += 10은 b = 10+10, 즉 b = 20
- Python에선 b = 20 이 새로운 인스턴스 20을 가리킨다는 의미가 된다(a는 여전히 10을 가리키고 있음)
- 결과 b=20, a=10 (즉 Call By Value의 결과와 같다.)
단 이는 Immutable(불변) 객체에만 해당한다. Python에는 Immutable 객체와 Mutable 객체가 있다.
- Immutable: int, float, tuple, str...
- Mutable: dic, list, set...
Imuutable 객체인 객체 10은 불변이기 때문에 +10을 한다고 해서 객체 10이 20이 되는 게 아닌 새로운 객체 20이 생성되는 방식.
하지만 Mutable 객체(예를 들어 list)는 변할 수 있기 때문에 list_num을 함수 인자로 넘기고 함수 내부에서 list_num.append(1)과 같은 동작으로 인자를 변형. 새로운 객체를 생성하고 연결하는 게 아니기 때문에 Call By Reference와 같은 결과.
'언어 | Framework > Python' 카테고리의 다른 글
[Python] Embedding Python return 값 여러 개 받기 (0) | 2021.11.12 |
---|---|
[Python] 개요 (0) | 2021.07.13 |
[Python] 1. 파이참 설치(PyCharm) (0) | 2020.12.29 |
[Python] 0. 설치(for windows) (0) | 2020.12.29 |