[Fluent Python]객체 참조, 가변성, 재활용
객체를 참조한다 ⇒ 주소에 할당되어 있는 메모리 주소를 공유한다.
객체는 생성되고 선언되어진다.
== 는 객체의 값을 비교한다.(eq() 특별 메소드를 호출함)
is 는 객체의 정체성을 비교한다.(속도가 더 빠름, 특별 메서드 호출을 안함)
기본 복사는 얕은 복사
리스트 혹은 내장 가변 컬렉션을 복사하는 가장 손쉬운 방법은 그 자료형 자체의 내장 생성자를 사용
l1 = [3, [55,44,(7,8,9)]
l2 = list(l1)
l2
# [3, [55,44,(7,8,9)]
l2 == l1
# True
l2 is l1
# False
l3 = l1[:]
# 얕은 사본을 생성(Shallow Copy)
최상위 컨테이너는 복사하지만 사본은 원래 컨테이너에 들어 있던 동일 객체에 대한 참조
l1 = [list, tuple]
l2 = l1
l2는 따로 메모리에 할당 but l1 안에 list, tuple을 참조
위에서 복합 할당 연산자 사용시 list는 참조된 주소의 값을 변경
튜플은 새로 만들어서 할당 시킴 (불변성 원칙)
가변형을 매개변수 기본값으로 사용하는 것은 올바르지 않다.
def f1(list=[]):
list.append(’a’)
return list
이렇게 할 시에 예상은 list 새로 생성되어진다고 생각하지만 그것이 아니고 재사용되어진다.
list 는 []를 참조한다.
del 명령은 이름을 제거하는 것이지 객체를 제거하는 것이 아니다.
⇒ del 명령의 결과로 객체가 가비지 컬렉트될 수 있지만 제거된 변수가 객체를 참조하는 최후의 변수거나 객체에 도달할 수 없을 때만 가비지 컬렉트된다.
약한 참조 ⇒ 참조 카운트를 증가시키지 않고 객체를 참조한다. 참조 대상이 가비지 컬레트되는 것을 방지하지 않음
weakref() 보다는 finalize() 를 사용하는 것이 좋다.
모든 파이썬 객체가 약한 참조의 대상이 될 수 있는 것은 아니다.
list와 dict 객체는 참조 대상이 될 수 없다.
튜플[:]은 참조를 반환한다.
t1 = (1,2,3)
t2 = t1 #기본적으로 새로 생성할 것 같지만 아니다.
t1 is t2 # True
스트링 리터럴은 공유 객체를 생성하기도 한다.