변수가 데이터를 저장하는 상자가 아니다.
포스트잇을 통한 예시가 너무 찰떡인 듯?ㅎ
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는 내용만 같은 아예 다른 객체에 바인딩된 것.

x is Nonex is not None
튜플 자체는 불변형이지만, 참조된 항목이 가변형이면 참조된 항목은 변할 수 있다.
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는 다르다고 판단됨.
작년에 정리한 내용도 봐주시길
함수는 인수로 전달받은 모든 가변 객체를 변경 가능하나,
객체의 정체성 자체는 변경 XX.
=> 객체를 다른 객체로 바꿀 수 없다.
(저자가 위키 백과 설명 언급하심..)
