

Python은 정수, 함수, 클래스, 모듈, 타입 자체가 전부 객체 형태
Java처럼 int 같은 원시 타입(primitive)가 따로 없음
CPython 기준으로 모든 객체는 내부적으로 PyObject 구조체이고, 최소한 세 가지를 가짐
여기서 중요한 것은, 타입은 객체에 붙어있지 변수에 붙어있지 않음
Java는 int x 처럼 변수에 타입이 선언되지만, Python은 객체가 자기 타입을 들고 다님
Java의 변수는 “값(또는 참조)을 담는 상자”
Python의 변수는 상자가 아니라 “객체에 붙인 이름표”
2가지를 예시로 들면 아래와 같음:
[가변성. int, float, str 등등]
a = [1, 2, 3]
b = a
# a --> [1, 2, 3] <-- b (객체 하나, **이름표 둘**)
[불변성. list, dict 등등]
a = [1, 2, 3]
b = a
print(id(a) == id(b)) # True <- 같은 객체
print(a is b) # True <- is는 정체성 비교
그래서 Python에는 Java의 “primitive vs reference” 구분 자체가 없고, 모든 건 참조 의미론으로 동작
다만 불변 객체(int, str, tuple)는 재바인딩만 가능해서 마치 값처럼 보일 뿐