Ch 3. 딕셔너리와 집합

Ch 6. 객체 참조, 가변성, 재활용

변수의 개념

변수가 데이터를 저장하는 상자가 아니다.
포스트잇을 통한 예시가 너무 찰떡인 듯?ㅎ

a = [1, 2, 3]
b = a
a.append(4)
print(b) # [1, 2, 3, 4]

파이썬 변수 == 자바에서의 참조 변수
∴ 변수는 객체에 붙은 레이블


할당문 b=a는 상자 a에 있는 값을 상자 b에 복사하는 것이 아닌
a라는 레이블이 붙은 객체에 레이블 b를 또 붙이는 것이다.

  • ‼️ 참조 변수 사용할 때의 표현
    : 변수가 객체에 할당되었다 >>> 객체를 변수에 할당했다
    객체는 변수가 할당되기 전에 생성되는 것.

파이썬 할당문 x=...는 등호 오른쪽에서 생성되거나 참조되는 객체에 x 명칭을 바인딩하며, 객체는 이름에 바인딩되기 전에 이미 존재해야 한다.

class Gizmo:
    def __init__(self):
        print(f'Gizmo id: {id(self)}')

x = Gizmo() --- (a)
y = Gizmo() * 10 --- (b)

(a)는 Gizmo id: 1967013185104
(b)의 경우, Gizmo라는 인스턴스에 숫자를 곱하는 것이기에 다음과 같은 예외가 발생한다.

Traceback (most recent call last):
  File "C:\Users\726jo\Desktop\python study\pythonProject\assign.py", line 11, in <module>
    y = Gizmo() * 10
        ~~~~~~~~^~~~
TypeError: unsupported operand type(s) for *: 'Gizmo' and 'int'

y = ~~에서 등호의 오른쪽 할당문에서 예외가 발생했으므로 변수 y가 생성되지 않는 것!

정체성, 동질성, 별칭

객체에 여러 레이블을 붙이는 것을 별칭이라고 하고,
동일한 객체를 참조하는 어떤 값이 있을 때
is 연산자와 id() 함수로 확인할 수 있다.

charles = {'name': 'C.L.D', 'born': 1832}
lewis = charles
print(lewis is charles) # True
print(id(charles), id(lewis))

alex = {'name': 'C.L.D', 'born': 1832}
print(alex == charles) # True
print(alex is not charles) # True

다음 그림에서 알 수 있듯이, lewis는 charles의 별칭이며, 둘은 같은 객체에 바인딩된 것.
반면, alex는 내용만 같은 아예 다른 객체에 바인딩된 것.

  • ‼️정체성
    allex에 바인딩된 객체와 charlesㅇ 바인딩된 객체의 값(내용물?)이 같아 ==연산자는 동일하다고 판단하지만, 정체성은 다르다.
    객체의 정체성은 생성된 후에는 변경되지 X

== 연산자와 is 연산자

  • ==(동치 연산자)는 객체의 값을 비교
  • is 연산자는 객체의 정체성 비교
  • 변수를 싱글톤과 비교할 때는 is 연산자를 사용
    x is None
    x is not None
    • None은 is 로 검사할 때 널리 사용되는 싱글톤

튜플의 상대적 불변성

튜플 자체는 불변형이지만, 참조된 항목이 가변형이면 참조된 항목은 변할 수 있다.

t1 = (1, 2, [30, 40])
t2 = (1, 2, [30, 40])
print(t1 == t2)

print(id(t1[-1]))

t1[-1].append(100)
print(t1)

print(id(t1[-1]))

print(t1 == t2) # False

t1[-1]의 정체성은 그대로, 값만 변경되었음.
마지막에 t1과 t2는 다르다고 판단됨.

얕은 복사와 깊은 복사

작년에 정리한 내용도 봐주시길

  • 생성자나 [:]을 사용하면 얕은 사본(shallow copy) 생성

참조로서의 함수 매개 변수

함수는 인수로 전달받은 모든 가변 객체를 변경 가능하나,
객체의 정체성 자체는 변경 XX.
=> 객체를 다른 객체로 바꿀 수 없다.

놀람 최소화 원칙(Principle Of Least Astonishment)

(저자가 위키 백과 설명 언급하심..)

del과 가비지 컬렉션

  • weakref
  • reference count
  • CPython을 더 알아보라는 저자의 큰 그림?
profile
기회를 잡는 사람이 되도록!

0개의 댓글