반응형
# 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 |
반응형
'Algorithm > 자료구조, 알고리즘' 카테고리의 다른 글
[코딩 + 알고리즘 완주반] 11일차. 배열, 큐 (0) | 2021.03.25 |
---|---|
[코딩 + 알고리즘 완주반] 11일차. 자료구조, 알고리즘 개요 (0) | 2021.03.25 |
[코딩 + 알고리즘 완주반] 10일차. 타이핑 게임 프로젝트 (0) | 2021.03.25 |
[코딩 + 알고리즘 완주반] 9일차. 데이터베이스 연동 (SQLite) (0) | 2021.03.23 |
[코딩 알고리즘 완주반] 8일차. 파이썬 외부 파일 처리 ( Excel, CSV 파일) (0) | 2021.03.22 |