본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] is와 ==의 결정적 차이 2가지와 Interning 최적화 해결 방법

by Papa Martino V 2026. 3. 15.
728x90

인터닝(Interning) 개념
인터닝(Interning)  개념

 

파이썬을 사용하다 보면 값을 비교할 때 == 연산자와 is 연산자를 마주하게 됩니다. 겉보기에는 비슷해 보이지만, 이 둘은 메모리 관리 측면에서 완전히 다른 메커니즘을 가집니다. 특히 파이썬의 내부 최적화 기법인 인터닝(Interning) 개념이 개입하면 결과가 예상과 다르게 나타날 수 있습니다. 본 포스팅에서는 전문가의 시각에서 is==의 근본적인 차이점을 분석하고, 파이썬이 메모리를 절약하기 위해 사용하는 문자열 및 정수 인터닝의 작동 원리와 실무에서 발생할 수 있는 버그 해결 방법을 상세히 다룹니다.


1. Comparison vs Identity: 비교와 동일성의 차이

파이썬에서 두 객체를 비교할 때, 우리는 '값이 같은가'와 '객체 자체가 같은가'를 구분해야 합니다.

  • == (Equality): 객체의 값(Value)이 같은지를 확인합니다. 내부적으로 __eq__() 매직 메서드를 호출하여 논리적인 일치 여부를 판단합니다.
  • is (Identity): 객체의 고유 주소(Memory Address/ID)가 같은지를 확인합니다. 즉, 두 변수가 물리적으로 동일한 메모리 위치를 가리키고 있는지를 판단합니다.

2. 파이썬의 마법: Interning(인터닝)이란 무엇인가?

인터닝은 자주 사용되는 특정 객체를 메모리에 단 한 번만 생성하고, 이를 여러 곳에서 공유(Sharing)하는 최적화 기법입니다. 이를 통해 메모리 사용량을 줄이고, is 연산 속도를 높일 수 있습니다.

(1) Integer Interning (Integer Caching)

CPython 인터프리터는 실행 시점에 -5부터 256까지의 정수를 미리 메모리에 올려둡니다. 이 범위 내의 숫자를 할당하면 파이썬은 새 객체를 만들지 않고 미리 생성된 객체의 주소를 넘겨줍니다.

(2) String Interning

문자열의 경우, 식별자(Identifier) 규칙을 따르는 짧은 문자열이나 컴파일 시점에 결정된 리터럴 등을 인터닝합니다. 이는 문자열 비교 시 문자 하나하나를 대조하는 대신 주소값만 비교하여 성능을 극대화하기 위함입니다.


3. is와 == 연산 및 인터닝 비교 요약

항목 == 연산자 is 연산자 Interning 발생 시
판단 기준 값(Value)의 논리적 일치 메모리 주소(ID)의 일치 is 결과가 True가 됨
주요 사용처 데이터 비교, 조건문 None 체크, 싱글톤 객체 확인 메모리 최적화 영역
메서드 호출 obj.__eq__(other) id(obj) == id(other) 자동 주소 공유
예상 결과 항상 값이 같으면 True 인터닝 범위 밖이면 False 가능 물리적으로 동일 객체 취급

4. Sample Example: 인터닝으로 인한 결과 차이 확인

다음 예제 코드를 통해 인터닝이 is 결과에 어떤 영향을 주는지 직접 확인할 수 있습니다.

# 1. 정수 인터닝 (-5 ~ 256 범위)
a = 256
b = 256
print(f"256 - is: {a is b}, ==: {a == b}")  # True, True

c = 257
d = 257
print(f"257 - is: {c is d}, ==: {c == d}")  # False, True (인터닝 범위를 벗어남)

# 2. 문자열 인터닝
s1 = "hello"
s2 = "hello"
print(f"String - is: {s1 is s2}, ==: {s1 == s2}") # True, True

# 3. 명시적 인터닝 해결 방법
import sys
s3 = sys.intern("dynamic_string_from_runtime!")
s4 = sys.intern("dynamic_string_from_runtime!")
print(f"Manual Intern - is: {s3 is s4}") # True
    

5. 실무에서의 주의사항 및 최적화 방법

인터닝을 잘못 이해하면 로직 버그를 초래할 수 있습니다. 성능과 안정성을 모두 잡기 위한 해결 방법은 다음과 같습니다.

  1. None 비교는 항상 is: None은 파이썬에서 유일한 싱글톤 객체이므로 if x is None: 형식을 사용하는 것이 관례이며 더 빠릅니다.
  2. 값 비교는 반드시 ==: 정수나 문자열의 값을 비교할 때는 인터닝 여부에 의존하지 말고 항상 ==를 사용해야 합니다. 코드가 실행되는 환경(CPython 버전, PyPy 등)에 따라 인터닝 규칙이 다를 수 있기 때문입니다.
  3. sys.intern() 활용: 대규모 문자열 검색이나 사전(dict)의 키로 문자열을 빈번하게 사용할 경우, 명시적으로 sys.intern()을 사용하여 메모리 효율을 높이십시오.

6. 결론 및 출처

파이썬의 is==의 차이를 명확히 이해하는 것은 메모리 관리의 첫걸음입니다. 인터닝은 파이썬이 개발자 모르게 수행하는 훌륭한 최적화이지만, 그 경계를 모른다면 예상치 못한 False를 만날 수 있습니다. 값의 일치를 원한다면 ==를, 객체의 정체성을 확인하고 싶다면 is를 선택하는 원칙을 지키시기 바랍니다.

 

참고 문헌 및 출처:

  • CPython Source Code - Internal Object Caching
  • Python Language Reference - Comparisons & Identity
  • Fluent Python (Luciano Ramalho) - Object References and Mutability
728x90