본문 바로가기

Web/Fundamental

RePython 15.5일차 Python에서 mutable자료형은 같은 값의 id(주소)한다 던데 맞을까? Call By Reference

Insight

1.  파이썬에서는 is 로 변수들을 비교하자. 

2.  튜플과 같은 불변형은 동일한 값을 변수들에게 할당해도 같은 id를 공유한다.

 

나는 할당 연산자를  무의미 하게 사용한다.

 

그래서 차이를 정확하게 짚고 넘어가고 mutable과 immutable의 차이를 더 깊게 구분 지어 보고자 한다.

 

주제를  한마디로 정의하는 것이passed by assignment 

불변 타입의 객체를 넘 길때 call by value (==,값)

가변 타입의 객체는 call by reference (is, 주소아이디)

서로 비슷해 보이는 변수의 id를 __eq__ 로 증명해 보자

 

일단 딕셔너리로 테스트해보자.

 

x = {'name': 'ryu', 'age' : 20} 
w = {'name': 'ryu', 'age' : 20} 
y = x

print(id(w), id(x), id(y)) # 139931908381984, 140465038699488 140465038699488
print( x == y ) # True  값 비교
print( x is y) # True 아이디 비교
print( x , y)  # {'name': 'ryu', 'age': 20} {'name': 'ryu', 'age': 20}
print( id(x), id(y)) # 140465038699488 140465038699488

x['class'] = 10
print( x,y) # {'name': 'ryu', 'age': 20, 'class': 10} {'name': 'ryu', 'age': 20, 'class': 10}

딕셔너리는  mutable하니까  같은 값이여도 변수에 공유하는 아이디를 가지지 않는다.

 

 

 모든 아이디,값이 같다. 심볼릭 링크와 비슷한 개념

 

z =  {'name': 'ryu', 'age': 20, 'class': 10}

print(x is z)
print( id(x), id (x)) # 아이디 값만 다르고 값은 다 같다

 

객체 생성 후 완전 불변 -> 즉 id는 객체 주소(정체성)비교, ==(eq)는 값비교

 

그래서 같은 것인지 비교하고 싶을때 id를 비교하는 is를 먼저 쓰는 것을 파이썬에서 공식적으로 추천한다.

 

리스트는 어떨가?

list1 = [10, 20, 30]
list4 = [10, 20, 30]
list2 = list1
list3 = list(list1)

print(list3) # [10, 20, 30]

print(id(list1), id(list2), id(list3), id(list4)) # 140243564503600 140243564503600 140243563153680 140243563130224
# 튜플과 다르게 같은 값이 여도 공유하는 id를 가지지 않는다 mutable하니까.
print(list1 == list2) # T
print(list1 is list2) # T
print(list1 == list3) # T
print(list1 is list3) # F  왜냐하면 리스트 생성자(list())로 복사했기 때문에 된다. 

 

리스트는 mutable하니까 같은 값이여도 변수에 공유하는 아이디를 가지지 않는다

 

튜플은 어떨가?

print('---')
tu1 = (10,12,13)
tu2 = (10,12,13)
tu3 = tu1
print(id(tu1),id(tu2),id(tu3)) # 139748597647552 139748597647552 139748597647552 튜플 또한 마찬가지 이다.
# immutable한 일정한 자료형이 있을 시 같은 값을 공유한다.

immutable한 같은 값을 변수에 재 할당 할 시 같은 아이디를 공유한다.

tu1,tu2,tu3이 같다