진박사의 일상

[Python] 함수에 call by reference로 객체 넘기기 본문

프로그래밍

[Python] 함수에 call by reference로 객체 넘기기

진박사. 2021. 9. 18. 20:22
class tmp:
    def __init__(self, num):
        self.num = num

def foo1(a):
    a = tmp(3)

def foo2(a):
    a[0] = tmp(3)

a = tmp(1)
foo1(a)
print(a.num) ##### 1

a = [tmp(1)]
foo2(a)
print(a[0].num) ##### 3

파이썬을 하다보면 사용자 정의 객체를 함수 안에서 다른 객체로 덮어쓰기 하고 싶을 때가 있다.

C의 경우 이런 경우에는 pointer를 이용해서 call by reference를 하면 되겠지만 파이썬은 어떻게 하면 되는걸까?

파이썬의 경우 immutable 객체는 call by value처럼 함수에서 처리가 된다. 그리고 사용자 정의 인스턴스도 그런식으로 처리되는 것 같다. 그래서 foo1함수에 tmp 객체 a를 넣어서 함수 내부에서 다른 tmp객체(tmp(3))으로 덮어씌웠지만 함수를 벗어나서 확인해보면 원본 a가 변하지 않은 것을 볼 수 있다.

이런 경우 a를 mutable 객체인 list로 씌워서 넘기면 해결할 수 있다. foo2함수에는 tmp 객체 a를 list에 씌운 것을 매개변수로 넘겼다. 그렇기 때문에 함수 내부에서 a[0]을 변경했을 때 함수 외부에서도 a[0] 값이 무사히 변경된 것을 알 수 있다.

간단한 예로도 은근 헷갈리는데 복잡한 프로젝트에서 이런 부분이 헷갈리면 상당히 멘붕할 듯... 잘 확인하자 ㅎㅎ