본문 바로가기
Algorithm/자료구조, 알고리즘

[코딩 + 알고리즘 완주반] 11일차. Object Reference

by newnu 2021. 3. 25.
반응형

# is , __eq__

is, id :  id 비교 ( 같은 객체 인지)

__eq__, ==  : 값이 같은지 비교

# 객체 참조 중요한 특징들
# python object reference

print("ex1-1")
print(dir())

# id vs __eq__ (== 증명)
x = {'name':'kim','age':33,'city':'Seoul'}
y=x # 얕은 복사

print('ex-2-1 - ', id(x),id(y))
print('ex-2-2 - ', x==y)
print('ex-2-3 - ', x is y)
print('ex-2-4 - ', x,y)

x['class'] = 10 # x가 수정되면 y도 수정됨
print('ex2-5 - ',x,y)

print()

z = {'name':'kim','age':33,'city':'Seoul','class':10}

print('ex-2-6 - ', x,z)
print('ex-2-7 - ', x is z) # 같은 객체? False ->  서로 다른 id
print('ex-2-8 - ', x is not z)
print('ex-2-9 - ', x==z) # 값은 같음

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

print()

#튜플 불변형의 비교
tuple1 = (10,15,[100,1000])
tuple2 = (10,15,[100,1000])

print('ex-3-1 - ', id(tuple1),id(tuple2))
print('ex-3-2 - ', tuple1==tuple2) # 값은 같음
print('ex-3-3 - ', tuple1 is tuple2) # False - 다른 객체
print('ex-3-4 - ', tuple1.__eq__(tuple2)) # 같은 값

print()
ex1-1
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
ex-2-1 -  140357652729408 140357652729408
ex-2-2 -  True
ex-2-3 -  True
ex-2-4 -  {'name': 'kim', 'age': 33, 'city': 'Seoul'} {'name': 'kim', 'age': 33, 'city': 'Seoul'}
ex2-5 -  {'name': 'kim', 'age': 33, 'city': 'Seoul', 'class': 10} {'name': 'kim', 'age': 33, 'city': 'Seoul', 'class': 10}

ex-2-6 -  {'name': 'kim', 'age': 33, 'city': 'Seoul', 'class': 10} {'name': 'kim', 'age': 33, 'city': 'Seoul', 'class': 10}
ex-2-7 -  False
ex-2-8 -  True
ex-2-9 -  True

ex-3-1 -  140357654528832 140357654528960
ex-3-2 -  True
ex-3-3 -  False
ex-3-4 -  True

 

# copy, deep copy

# copy, deepcopy (얕은 복사, 깊은 복사)

# copy
tl1 = [10,[100,105],(5,10,15)]
tl2 = tl1
tl3 = list(tl1) # 자료형 생성자로 새로 생성 
# 새로운 리스트를 복사할 떄는 자료형 생성자를 사용해야 안전하게 사용가능

print('ex4-1 - ',tl1==tl2)
print('ex4-2 - ',tl1 is tl2)
print('ex4-3 - ',tl1==tl3) # 값 같음
print('ex4-4 - ',tl1 is tl3) # tl1, tl3 객체 다름

# 증명
tl1.append(1000)
tl1[1].remove(100)

print('ex4-5 - ',tl1)
print('ex4-6 - ',tl2)
print('ex4-7 - ',tl3)

print()

print(id(tl1[2]))
tl1[1]+=[110,120]
tl1[2]+=(110,120)

print('ex4-8 - ',tl1)
print('ex4-8 - ',tl2) # 튜플 재 할당 (객체 새로 생성)
print('ex4-8 - ',tl3)

print(id(tl1[2])) # 튜플 재할당

print()

# Deep Copy

# 장바구니
class Basket : 
    def __init__(self,products=None):
        if products is None:
            self._products = [] # 인스턴스 변수
        else:
            self._products = list(products) # id 새로 할당
    
    def put_prod(self, prod_name):
        self._products.append(prod_name)

    def del_prod(self, prod_name):
        self._products.remove(prod_name)

import copy

basket1 = Basket(['Apple','Bag','TV','Snack','Water'])
basket2 = copy.copy(basket1)
basket3 = copy.deepcopy(basket1)

print('ex5-1 - ',id(basket1),id(basket2),id(basket3)) 
print('ex5-2 - ',id(basket1._products),id(basket2._products),id(basket3._products))
# copy - 인스턴스는 서로 다른 객체지만 안에 변수들은 같음
# deep copy - 안의 인스턴수 변수까지 복사 

print()

basket1.put_prod('Orange')
basket2.del_prod('Snack')

print('ex5-3 - ',basket1._products) # basket1 과 basket2의 _product는 같은 객체 ( 수정, 삭제 같이)
print('ex5-4 - ',basket2._products)
print('ex5-5 - ',basket3._products) # basket3은 독자적
ex4-1 -  True
ex4-2 -  True
ex4-3 -  True
ex4-4 -  False
ex4-5 -  [10, [105], (5, 10, 15), 1000]
ex4-6 -  [10, [105], (5, 10, 15), 1000]
ex4-7 -  [10, [105], (5, 10, 15)]

140357652972224
ex4-8 -  [10, [105, 110, 120], (5, 10, 15, 110, 120), 1000]
ex4-8 -  [10, [105, 110, 120], (5, 10, 15, 110, 120), 1000]
ex4-8 -  [10, [105, 110, 120], (5, 10, 15)]
140357616329008

ex5-1 -  140357653181248 140357653182064 140357653182784
ex5-2 -  140357654548736 140357654548736 140357654530048

ex5-3 -  ['Apple', 'Bag', 'TV', 'Water', 'Orange']
ex5-4 -  ['Apple', 'Bag', 'TV', 'Water', 'Orange']
ex5-5 -  ['Apple', 'Bag', 'TV', 'Snack', 'Water']

 

# 함수 매개변수 전달 사용법

# 함수 매개변수 전달 사용법

def mul(x,y):
    x+=y
    return x

# 일반 정수형
x=10
y=5

print('ex6-1 - ',mul(x,y),x,y)
print()

# 가변형
a = [10,100]
b = [5,10]

print('ex6-2 - ',mul(a,b),a,b) # 가변형 a -> 데이터 변경


# 불변형
c = (10,100)
d = (5,10)

print('ex6-2 - ',mul(c,d),c,d) # 불변형 c -> 데이터 변경 안됨
print()

# 파이썬 불변형 예외
# str, bytes,fozenset, Tuple : 사본 생성 X -> 참조 반환

tt1 = (1,2,3,4,5)
tt2 = tuple(tt1) # 보콩 생성자를 이용하면 새로운 객체지만 tuple형은 참조 반환
tt3 = tt1[:]

print('ex7-1 - ',tt1 is tt2, id(tt1),id(tt2))
print('ex7-2 - ',tt3 is tt2, id(tt1),id(tt3))

tt4 = (10,20,30,40,50) 
tt5 = (10,20,30,40,50) # 아예 똑같은 값이면 하나의 객체를 참조
ss1 = 'Apple'
ss2 = 'Apple'

print('ex7-3 - ',tt4 is tt5, tt4,tt5,id(tt4),id(tt5))
print('ex7-4 - ',ss1 is ss2, ss1,ss2,id(ss1),id(ss2))
ex6-1 -  15 10 5

ex6-2 -  [10, 100, 5, 10] [10, 100, 5, 10] [5, 10]
ex6-3 -  (10, 100, 5, 10) (10, 100) (5, 10)

ex7-1 -  True 140202460635440 140202460635440
ex7-2 -  True 140202460635440 140202460635440
ex7-3 -  True (10, 20, 30, 40, 50) (10, 20, 30, 40, 50) 140202461554864 140202461554864
ex7-4 -  True Apple Apple 140202472993520 140202472993520

 

반응형