1. 학습목표
- shallow copy vs. deep copy
2. 학습내용
# copy, deepcopy (깊은 복사, 얕은 복사)
# copy
tl1 = [10, [100, 105], (5, 10, 15)]
tl2 = tl1
tl3 = list(tl1) # 요렇게 복사해야 안전해요..!
# print('EX4-1 -', tl1 == tl2)
# EX4-1 - True
# print('EX4-2 -', tl1 is tl2)
# EX4-2 - True
# print('EX4-3 -', tl1 == tl3)
# EX4-3 - True
# print('EX4-4 -', tl1 is tl3)
# EX4-4 - False
# 증명
tl1.append(1000)
tl1[1].remove(105)
# print('EXT4-5 -', tl1)
# EXT4-5 - [10, [100], (5, 10, 15), 1000]
# print('EXT4-6 -', tl2)
# EXT4-6 - [10, [100], (5, 10, 15), 1000]
# print('EXT4-7 -', tl3)
# EXT4-7 - [10, [100], (5, 10, 15)]
# print(id(tl1[2]))
# 4340346024
tl1[1] += [110, 120]
tl2[2] += (110, 120) # 이런식으로 리스트 안에 튜플을 넣는 것은 안전하지 않다!
# print(id(tl1[2]))
# 4338308376
# print('EXT4-8 -', tl1)
# EXT4-8 - [10, [100, 110, 120], (5, 10, 15, 110, 120), 1000]
# print('EXT4-9 -', tl2) # 튜플이 재할 당(객체 새로 생성)
# EXT4-9 - [10, [100, 110, 120], (5, 10, 15, 110, 120), 1000]
# print('EXT4-10 -', tl3)
# EXT4-10 - [10, [100, 110, 120], (5, 10, 15)]
# 잠깐 나의 궁금증! 해결!
haha = (1,2,)
haha += (3,4,)
# print(haha)
# (1, 2, 3, 4)
# deep copy
# 장바구니
class Basket:
def __init__(self, products=None):
if products is None:
self._products = []
else:
self._products = list(products)
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))
# EX5-1 - 4333037552 4333037608 4333038952
# print('EX5-2 -', id(basket1._products), id(basket2._products), id(basket3._products))
# EX5-2 - 4334195016 4334195016 4333777352
basket1.put_prod('orange')
basket2.del_prod('snack')
# print('EXT5-3 -', basket1._products)
# EXT5-3 - ['apple', 'bag', 'tv', 'water', 'orange']
# print('EXT5-4 -', basket2._products)
# EXT5-4 - ['apple', 'bag', 'tv', 'water', 'orange']
# print('EXT5-5 -', basket3._products)
# EXT5-5 - ['apple', 'bag', 'tv', 'snack', 'water']
3. 느낀 점