# 식별 연산자 : 두 개의 대상 객체가 동일한 객체를 참조하는가(주소)?
# is : 객체가 같다(주소를 기반으로 확인한다)
# not is : 객체가 다르다

a = 10
b = 10
# 메모리에서 10이라는 정수 객체가 만들어지고 a와 b가 이를 참조하게 된다.
# a와 b는 서로 동일한 객체를 참조하게 된다.
print(a is b)   # True. 실질적으로 같다.

print(id(a))    # id()를 사용하여 찍은 두 객체의 주소가 같다
print(id(b))

# 파이썬은 참조계수기법으로 객체들을 관리한다.
a1 = 10
b1 = 10
print(a is b)
print(id(a))
print(id(b))

b1 = 100    # b가 참조하는 대상의 객제가 달라지므로 a와 b는 서로 다르다.
print(a1 is b1)
print(id(b1))

my_list1 = [10, 20, 30, 40]
my_list2 = my_list1     # True. Shallow Copy. 주소를 복사한다. 이 두 리스트 객체 모두 같은 객체를 참조한다.
print(my_list1 is my_list2)

my_list3 = [10, 20, 30, 40]    # 두 리스트는 서로 다른 객체를 참조한다.
print(my_list1 is my_list3)     # false

my_list1[0] = 100   # 대상 객체가 바뀌었기 때문에 둘 다 값이 바뀐다.
print(my_list1)
print(my_list2)
print(my_list1 is my_list2)
print(id(my_list1))
print(id(my_list2))

# Shallow copy와 Deep copy
the_list = [10, 20, 30]
new_list1 = the_list    # shallow copy : 주소를 복사
nwe_list2 = the_list.copy() # deep copy