파이썬 객체 식별자(id())와 is 연산자 이해

파이썬 객체 식별성: 객체의 고유 식별자 이해

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

- 초급~중급 파이썬 개발자

- 객체 식별성, 메모리 관리, 불변/가변 객체 차이를 이해하고자 하는 개발자

- 값과 식별자 구분이 필요한 실무 시나리오 개발자

핵심 요약

  • 객체의 식별자(id())는 메모리 주소를 기반으로 고유하게 생성되며, 객체가 존재하는 동안 변하지 않는다
  • is 연산자는 식별자 비교에 사용되며, ==는 값의 동등성 비교에 사용된다
  • 불변 객체(예: 정수)는 동일한 값이면 식별자가 재사용될 수 있으나, 가변 객체(예: 리스트)는 식별자가 다르게 생성된다

섹션별 세부 요약

1. 객체 식별성의 기초

  • 모든 파이썬 객체는 고유한 식별자가 존재하며, id() 함수로 확인 가능
  • is 연산자를 통해 두 객체가 동일한 식별자(메모리 주소)를 가지는지 검사 가능
  • 예: a = [1, 2, 3], b = aa is bTrue, id(a) == id(b)도 동일한 값

2. 식별성의 역사적 배경

  • 1945년: 바이네umann 아키텍처에서 메모리 주소 기반의 식별 개념 도입
  • 1972년: C 언어의 포인터로 식별성의 유용성 증명
  • 1991년: Python 0.9.0에서 is 연산자로 식별자 비교 기능 추가
  • 2000년: Python 2.0에서 id() 함수의 안정성 보장

3. 식별성의 실무 적용 사례

  • 동일한 값 vs 동일한 객체 구분:

```python

cup1 = [1, 2]

cup2 = [1, 2]

print(cup1 == cup2) # True (값 동등)

print(cup1 is cup2) # False (다른 식별자)

```

  • 공유 상태 추적:

```python

form1 = {"name": "Ada"}

form2 = form1

form2["name"] = "Alan"

print(form1["name"]) # "Alan" (동일한 식별자로 변경 반영)

```

  • 불변 객체의 재사용:

```python

a = 1

b = 1

print(a is b) # Often True (Python의 최적화로 인한 재사용)

```

4. 식별성 관리 팁

  • 복사로 공유 상태 회피:

```python

a = [1, 2, 3]

b = a.copy()

a[0] = 99

print(b[0]) # 1 (복사로 다른 식별자 생성)

```

  • is==의 목적 차이:

- is: 객체의 식별자(메모리 주소) 비교

- ==: 값의 동등성 비교

결론

  • is 연산자는 식별자 비교, ==는 값 비교에 사용
  • 가변 객체는 값이 같아도 식별자가 다를 수 있으므로, copy()로 복사하여 공유 상태 회피
  • 불변 객체는 동일한 값이면 식별자가 재사용될 수 있으나, 이는 Python의 구현에 따라 달라질 수 있음