string, list, function, modules까지
파이썬은 모든게 object이다.
여기서 객체(object)란 변수와 함수의 집합을 말한다.
객체 지향의 장점은 클래스로 한 묶음을 만들어버리고 필요할 때마다
파이썬 내장함수인 id()를 이용해서 identity를 알아볼 수 있는데 메모리 주소를 뜻한다.
i = 5
print(id(i), id(5))
>>> 94838556064384 94838556064384
둘 다 같은 메모리값의 주소를 포인터 형태로 가리키고 있음을 확인할 수 있다.
얕은 복사는 포인터를 복사하는 것이고
깊은 복사는 주소에 해당하는 값을 새로 재할당하는 것이다.
이런 얕은 복사와 깊은 복사로 포인터를 더 알아볼 수 있다.
# 얇은 복사
test = [1, 2, 3]
copy_test = test
test.append(4)
print(copy_test)
print(id(test), id(copy_test))
>>> [1, 2, 3, 4]
>>> 139824223227728 139824223227728
# 깊은 복사
import copy
test = [1, 2, 3]
deep_cp = copy.deepcopy(test)
print(deep_cp)
print(id(test), id(deep_cp))
>>> [1, 2, 3]
>>> 139824223080528 139824223638464
하지만 객체의 mutable과 immutable의 특성에 따라 달라질 수 있다.
immutable한 객체에 얇은 복사의 형태로 새로 할당을 해주면 기존 주소에 내용 추가가 아닌 새로 재할당이 된다.