파이썬에서 변수는 데이터를 직접 담는 상자가 아니에요. 메모리 어딘가에 있는 데이터 객체에 붙이는 이름표 같은 거죠.
word = 'apple'
# 'apple'이라는 문자열 객체가 메모리 어딘가(주소: 4373983536)에 생성됨
# word는 그 객체를 가리키는 이름표
코드 분석
# 1단계
word = 'apple'
print(id(word)) # 4373983536
# 메모리에 'apple' 객체 생성, word가 이를 가리킴
# 2단계
word = word.replace("p", "q")
print(id(word)) # 4378922672 (주소 변경!)
# 'apple'은 불변 객체라서 수정 불가
# 'aqqle'이라는 새로운 객체 생성
# word가 새 객체를 가리키도록 재바인딩
# 3단계
word = 'apple'
print(id(word)) # 4373983536 (원래 주소로 복귀!)
# 파이썬이 이미 메모리에 있는 'apple' 객체를 재사용
# 이것이 "문자열 인터닝(String Interning)"
# 4단계
word = 'banana'
print(id(word)) # 4378922288 (다른 주소)
# 'banana'는 새로운 객체이므로 다른 주소
# 5단계
word = 'apple'
print(id(word)) # 4373983536 (다시 같은 주소!)
# 또다시 기존 'apple' 객체 재사용
중요한 특징들
1. 문자열은 불변(Immutable)이다
word = 'apple'
# word[0] = 'A' # 에러 발생! 문자열은 수정 불가
word = 'Apple' # 새로운 객체 생성 후 재바인딩만 가능
2. 문자열 인터닝 (String Interning) 파이썬은 같은 문자열을 여러 번 만들지 않고 재사용해요. 메모리 절약을 위해서죠.
a = 'apple'
b = 'apple'
print(id(a)) # 4373983536
print(id(b)) # 4373983536 (같은 주소!)
print(a is b) # True (같은 객체를 가리킴)
3. 재바인딩(Rebinding) 변수에 새 값을 할당하면 다른 객체를 가리키게 돼요.
word = 'apple' # word → 'apple' 객체
word = 'banana' # word → 'banana' 객체 (다른 객체!)
시각적 이해
메모리 상황:
[주소: 4373983536] 'apple' ◄── word (1단계, 3단계, 5단계)
[주소: 4378922672] 'aqqle' ◄── word (2단계)
[주소: 4378922288] 'banana' ◄── word (4단계)
실습으로 확인하기
# 여러 변수가 같은 객체를 가리킬 수 있음
a = 'hello'
b = 'hello'
c = 'hello'
print(id(a), id(b), id(c)) # 모두 같은 주소!
# 리스트는 가변(mutable)이라서 다르게 동작
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(id(list1), id(list2)) # 다른 주소!