
Python에서 변수는 데이터 값을 직접 저장하는 것이 아니라 객체(Object)를 참조(Reference)합니다. 이 참조 모델은 Python의 메모리 관리 방식과 변수의 동작 원리를 이해하는 데 중요한 개념입니다. 특히, 불변 객체(Immutable)와 가변 객체(Mutable)의 차이를 이해하면 코드의 효율성을 높이고, 예기치 않은 동작을 예방할 수 있습니다. 이 장에서는 Python 변수의 메모리 구조와 값 복사 및 참조의 차이를 심도 있게 탐구합니다.
1. Python의 메모리 관리 개요
Python에서 모든 데이터는 **객체(Object)**로 표현됩니다. 변수는 이러한 객체를 참조하는 이름표(Tag) 역할을 합니다.
㉮ 변수와 객체
• 변수: Python의 변수는 데이터를 저장하는 메모리 주소를 참조.
• 객체: 데이터 자체를 의미하며, Python에서 모든 데이터는 객체로 구현.
예제
x = 42
• 42는 정수 객체로 메모리에 생성.
• 변수 x는 42 객체를 참조.
㉯ 객체 ID
Python의 id() 함수는 객체의 고유한 메모리 주소(참조 값)를 반환합니다.
예제: 객체 ID 확인
x = 42
print(id(x)) # x가 참조하는 객체의 ID 출력
2. 불변 객체와 가변 객체
Python의 객체는 불변 객체(Immutable)와 가변 객체(Mutable)로 나뉩니다.
㉮ 불변 객체 (Immutable Objects)
• 객체의 값이 생성된 이후 변경 불가능.
• 새 값을 할당하면 새로운 객체가 생성되고 변수는 새로운 객체를 참조.
• 주요 불변 객체:
• 정수형 (int)
• 실수형 (float)
• 문자열형 (str)
• 튜플 (tuple)
예제: 불변 객체의 동작
x = 10
print(id(x)) # x가 참조하는 객체의 ID 출력
x = 20
print(id(x)) # 새로운 객체를 참조
결과
140724269846784
140724269847104
㉯ 가변 객체 (Mutable Objects)
• 객체의 값이 변경 가능하며, 변수는 동일한 객체를 계속 참조.
• 주요 가변 객체:
• 리스트 (list)
• 딕셔너리 (dict)
• 집합 (set)
예제: 가변 객체의 동작
x = [1, 2, 3]
print(id(x)) # x가 참조하는 객체의 ID 출력
x.append(4) # 객체 값을 수정
print(id(x)) # 동일한 객체 ID 유지
결과
140720394781760
140720394781760
3. 값 복사와 참조
Python에서 변수 간 데이터 전달은 값 복사와 참조로 구분됩니다.
㉮ 값 복사 (Call by Value)
• 불변 객체를 다른 변수에 할당하면 새로운 참조를 생성.
• 두 변수가 동일한 값을 가리키지만, 객체는 독립적으로 관리.
예제
x = 10
y = x
x = 20
print(x) # 20
print(y) # 10
㉯ 참조 (Call by Reference)
• 가변 객체를 다른 변수에 할당하면 동일한 객체를 참조.
• 하나의 변수에서 값을 수정하면 다른 변수에도 영향을 미침.
예제
x = [1, 2, 3]
y = x
x.append(4)
print(y) # [1, 2, 3, 4] (y도 동일 객체를 참조)
㉰ 얕은 복사 (Shallow Copy)
• 새로운 객체를 생성하되, 내부 데이터는 기존 객체를 참조.
방법:
• 슬라이싱:
x = [1, 2, 3]
y = x[:]
• copy 모듈:
import copy
y = copy.copy(x)
예제
import copy
x = [[1, 2], [3, 4]]
y = copy.copy(x)
x[0][0] = 99
print(y) # [[99, 2], [3, 4]]
㉱ 깊은 복사 (Deep Copy)
• 새로운 객체를 생성하며, 내부 데이터까지 복사.
방법:
• copy.deepcopy 사용:
import copy
y = copy.deepcopy(x)
예제
import copy
x = [[1, 2], [3, 4]]
y = copy.deepcopy(x)
x[0][0] = 99
print(y) # [[1, 2], [3, 4]]
4. 메모리 관리와 참조 횟수
Python은 참조 카운트(reference count)를 기반으로 메모리를 관리합니다. 객체의 참조 횟수가 0이 되면 가비지 컬렉터(Garbage Collector)가 객체를 삭제합니다.
㉮ 참조 카운트 확인
• sys.getrefcount() 함수로 객체의 참조 횟수 확인.
예제
import sys
x = [1, 2, 3]
print(sys.getrefcount(x)) # 출력: 참조 횟수
5. 변수 사용 시 유의사항
㉮ 불변 객체 주의:
• 값 변경 시 새로운 객체를 생성하므로 메모리 낭비에 주의.
㉯ 가변 객체 공유 주의:
• 가변 객체를 함수나 변수 간 공유 시 예기치 않은 동작 가능.
㉰ 깊은 복사 활용:
• 중첩 구조 데이터를 복사할 때는 깊은 복사를 사용.
6. 요약
• Python 변수는 객체를 참조하며, 모든 데이터는 객체로 구현됩니다.
• 불변 객체와 가변 객체의 차이를 이해하면 변수 동작 방식을 명확히 알 수 있습니다.
• Python의 메모리 관리 방식은 참조 모델을 기반으로 하며, 참조 횟수가 0이 되면 가비지 컬렉터가 객체를 자동으로 정리합니다.
• 복사와 참조의 차이를 이해하고 올바르게 활용하면 코드의 효율성과 안정성을 높일 수 있습니다.
'코딩교육 > Python 초등교육에서 전문가까지' 카테고리의 다른 글
2단계 : 2. 조건문 (조건문 작성 시 유의사항, 들여쓰기, 조건 표현식) (0) | 2025.02.20 |
---|---|
2단계 : 2. 조건문 (feat. if, else, elif 의 기본 가용법) (0) | 2025.02.19 |
2단계 : 1. 변수와 자료형 (feat. 자료형 소개와 특징) (0) | 2025.02.13 |
2단계 : 1. 변수와 자료형 (feat. Python의 동적 타이핑 특성) (1) | 2025.02.12 |
2단계 : 1. 변수와 자료형 (feat. 변수란? 변수 선언, 할당, 사용법) (0) | 2025.02.11 |