파이썬을 공부하면서 알아가는 중’ 시리즈

파이썬의 call-by-reference

  • 0
  • 0
0
0

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

소스코드


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


결론

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

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

#파이썬 #콜바이레퍼런스 #call-by-reference

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