파이썬의 call by assignment (call by object-reference)

갑자기 call-by-reference가 헷갈려서 실험을 해봤다.

파이썬은 call by reference가 아닙니다. call by assignment입니다.

파이썬의 객체는 mutable한 객체와 immutable한 객체로 나눌 수 있습니다.
call by assignment는 mutable한 객체의 원소(element)를 변경할 수 있기 때문에 call by reference와 헷갈리는 것입니다. 참고로 call by assignment는 immutable한 객체는 변경할 수 없습니다.

소스코드


def A(str, list_t, inta):  
    print("2 : ", id(str))  
    print("2 : ", id(list_t))  
    print("2 : ", id(inta))  
  
    print("2 : ", str)  
    print("2 : ", list_t)  
    print("2 : ", inta)  
  
    str = str + "z"  
 list_t[0] = 3  
 inta = 9  
  
 print("2 : ", id(str))  
    print("2 : ", id(list_t))  
    print("2 : ", id(inta))  
  
    print("2 : ", str)  
    print("2 : ", list_t)  
    print("2 : ", inta)  
  
    list_t = [3]  
  
    print("3 : ", id(list_t))  
    print("3 : ", list_t)  
  
o_str = "abc"  
o_list_t = [1, 2]  
o_int = 1  
  
print("1 : ", id(o_str))  
print("1 : ", id(o_list_t))  
print("1 : ", id(o_int))  
  
print("1 : ", o_str)  
print("1 : ", o_list_t)  
print("1 : ", o_int)  
  
A(o_str, o_list_t, o_int)  
  
print("1 : ", id(o_str))  
print("1 : ", id(o_list_t))  
print("1 : ", id(o_int))  
  
print("1 : ", o_str)  
print("1 : ", o_list_t)  
print("1 : ", o_int)


1 :  2188683293808
1 :  2188683371008
1 :  140719838476064
1 :  abc
1 :  [1, 2]
1 :  1

2 :  2188683293808
2 :  2188683371008
2 :  140719838476064
2 :  abc
2 :  [1, 2]
2 :  1

2 :  2188689355184
2 :  2188683371008
2 :  140719838476320
2 :  abcz
2 :  [3, 2]
2 :  9

3 :  2188689252608
3 :  [3]

1 :  2188683293808
1 :  2188683371008
1 :  140719838476064
1 :  abc
1 :  [3, 2]
1 :  1


결론

함수에 인자로 정수형, 문자열을 넘겨 주었을 때, 함수 안에서 넘겨받은 정수형, 문자열을 수정해도 함수를 호출한 부분(함수 밖)에서는 변하지 않는다.

함수에 인자로 리스트를 넘겨줬을 때, 함수 안에서 리스트 자체에 새로운 리스트를 대입하면 함수 밖의 리스트는 변하지 않는다.
다만, 리스트의 원소를 교체했을 경우, 함수 밖의 리스트도 같이 변한다.

이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.