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이 같다
'Web > Fundamental' 카테고리의 다른 글
RePython 5일차 중간 파이썬에서 파라미터와 인자는 왜 구분 하는 걸까? (파이썬에서 파라미터의 기본값은 클래스의 인스턴스화에 어떤 영향을 끼치는가 ?) (0) | 2019.11.30 |
---|