Python - Basic - Data Types
Python 데이터 타입은 크게 두 가지 관점에서 분류할 수 있다.
1. 값의 구조 관점 (Single value vs Collection)
2. 변경 가능 여부 (Mutable vs. Immutable)
Python에서는 모든 데이터가 객체(object)로 관리되며, 변수는 객체를 직접 저장하는 것이 아니라 객체에 대한 참조 (reference)를 저장한다는 점이 중요하다.
Python에는 C나 Java처럼 공식적인 primitive/ non-primitive 구분이 존재하지 않는다.
Single Value Type: string, integer, float, boolean
Collection Type: array(list), hash map(dictionary), set, tuple
Immutable 데이터 타입의 오브젝트 생성 후 값이 절대 변하지 않는다. 값을 변경하면 기존 오브젝트를 수정하는 것이 아니라 새로운 오브젝트가 생성된다.
Mutable: list, dictionary, set
Mutable 데이터 타입은 오브젝트 생성 후 내부 값을 변경할 수 있으며, 값을 변경하면 오브젝트 자체가 메모리에서 직접 수정된다.
Immutable: string, integer, float, boolean, tuple
Immutable: 값 변경시 항상 새 오브젝트 생성
a = 10
b = a
a = 20
-> a = 10
-> b = 10
-> a = 20
-> b = 10
Mutable: 여러 변수가 한 오브젝트를 참조하면 모든 변수가 영향을 받음
a = [1,2,3]
b = a
a.append(10)
-> a = [1,2,3]
-> b = [1,2,3]
-> a.append(4)
-> a = [1,2,3,4]
-> b = [1,2,3,4]
Immutable: 새로운 객체를 생성
def change(x):
x += 1
a = 10
change(a)
print(a) # 10, not changed
Mutable: 함수 내부에서도 같은 오브젝트를 수정
def change(lst):
lst.append(100)
a = [1,2,3]
change(a)
print(a) # [1,2,3,100], changed
Mutable 오브젝트의 원본을 유지하고 싶을때는 복사를 통해 새로운 오브젝트를 생성해야 한다.
Immutable 오브젝는는 복사 개념이 필요없다.
Mutable 오브젝트를 함수의 기본 파라미터로 사용하면, 오브젝트가 함수 정의 시 단 한 번만 생성되어 이후 모든 호출에서 같은 오브젝트를 공유하는 문제가 생긴다.
Bad example
def add_item(item, lst = []):
lst.append(item)
return lst
add_item(1) # [1]
add_item(2) # [1,2]
Good example
def add_item(item, lst = None):
if lst is None:
lst = []
lst.append(item)
return lst