# 03.deep copy and swallow copy.py
# 0.객체 비교 연산자
# v1 == v2  -> 변수 v1과 v2가 참조하는 객체의 내용이 같은가?
# v1 is v2  -> 변수 v1과 v2가 참조하는 객체는 동일 객체인가?

r1 = [1, 2, 3]
r2 = [1, 2, 3]
print(r1 is r2) #False
print(r1 == r2) #True

r1 = [1, 2, 3]
r2 = r1 # r1이 참조하는 대상 [1, 2, 3]에 r2라는 이름을 하나 더 붙임
print(r1 is r2) #True



# 1.여러 요소들을 담고 있는 리스트의 예
r1 = ['John', ('man', 'USA'), [175, 23]] #문자열 객체와 튜플객체는 불변, 리스트 객체만 가변
r2 = ['John', ('man', 'USA'), [175, 23]]
print(r1 is r2) #False
print(r1[0] is r2[0]) # 불변요소는 같은 값을 참조하고 있다. 각각의 대상들을 복사하는 것이 아니고 참조를 복사한다.(얕은 복사)
print(r1[1] is r2[1]) # 불변요소는 같은 값을 참조하고 있다. 각각의 대상들을 복사하는 것이 아니고 참조를 복사한다.(얕은 복사)
print(r1[2] is r2[2]) # 가변요소는 서로 다른 값을 참조한다. 교재와 다르게 값이 나온다. 확인 요망
print('*')
r2 = list(r1)
print(r1 is r2)

# 2.얕은 복사의 예
J2021 = ['John', ('man', 'USA'), [175, 23]] #John이라는, USA사는 남자, 175Cm에 23살 먹은.
J2022 = list(J2021)
J2022[2][1] += 1
print(J2021) #얘도 1이 더해져 버렸다. 값이 변해야는데.
print(J2022)
print(J2021[2] is J2022[2])

# 3.deepcopy함수
J2021 = ['John', ('man', 'USA'), [175, 23]]
import copy
J2022 = copy.deepcopy(J2021)
J2022[2][1] += 1
print(J2021)
print(J2022)
print((J2021[0] is J2022[0] and J2021[1] is J2022[1])) #True 얕은 복사 확인
print(J2021[2] is J2022[2]) #False 깊은 복사 확인
# deepcopy를 하면 알아서 가변객체, 불변객체를 나눠서 그에 적합한 복사를 수행한다.
# 문자열과 튜플은 얕은 복사로, 리스트는 깊은 복사로
# 값의 효율성 때문에. 불변 객체는 변하지 않으니까 값만 참조시키면 되고, 가변 객체는 값이 변해야니까 통째로 전혀 다른 객체로  참조 값과 대상 자체를 복사 해버린다.

