반응형

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이라는 인스턴스를 가리키고 있다는 것을 의미한다.

 

  1. a = 10, 인스턴스 a가 인스턴스 10을 가리킴
  2. func() 호출에 의해 인스턴스 b가 a가 가리키는 10을 가리킴
  3. b += 10은 b = 10+10, 즉 b = 20
  4. Python에선 b = 20 이 새로운 인스턴스 20을 가리킨다는 의미가 된다(a는 여전히 10을 가리키고 있음)
  5. 결과 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와 같은 결과.

 

 

 

 

 

 

반응형
woongs_93