필자가 처음 파이썬을 시작 할 때 == 와 is 연산자의 차이를 알지 못하고 그냥 같은 역할을 하는 연산자인데 코드 가독성을 위해 is라는 것을 추가했나 보다라고 짐작하고 개발을하다 버그를 만들어 한참을 고생한 적이 있다. 이번 포스트는 이 두 연산자의 차이에 대해 알아 보도록하겠다.
이번 포스트를 이해하기 위해서는 파이썬의 변수란 '메모리 어딘가에 값을 가지고 있는 값 객체'를 가리키고 있는 참조자라는 것을 먼저 이해하고 있어야 한다. 모른다면 먼저 [여기]를 통해 살펴 보고 오도록 하자.
목차
- 파이썬 변수의 소개
- 변수의 타입
- 변수의 다양한 정보 확인
- ctype 모듈을 활용한 변수의 정보 확인
- >> == 와 is 연산자
- mutable 변수와 immutable 변수
- 변수의 삭제
- 파이썬 정수는 Overflow가 없다?
== 연산자(상등 연산자)는 변수의 값이 동일한지를 조사하는 연산자이며, is 연산자는 동일한 객체를 가리키는지 조사하는 연산자다.
다음 예를 살펴 보자(※ hex, id 와 같이 변수의 정보를 확인하는 방법이 궁금하다면 [여기])
s1 = 'To be or not to be'
s2 = s1
s3 = 'To be or not'
s3 = s3 + ' to be'
print('s1:' + s1 + ', addr:' + hex(id(s1)))
print('s2:' + s2 + ', addr:' + hex(id(s2)))
print('s3:' + s3 + ', addr:' + hex(id(s3)))
1라인에서 s1이 'To be or not to be'라는 문자열을 가리키도록 했고, 2라인에서는 s2는 s1과 같은 객체를 바라 보도록 했다.
4라인에서는 먼저 s3에 'To be or not'라는 문자열을 가키키도록 하여 s1, s2와는 다른 객체를 바라보도록하고, 그 이후, ' to be'를 추가하여 값은 같지만 다른 객체를 바라보도록 만들었다.
그리고 그 결과는 아래와 같다.
> python main.py
s1:To be or not to be, addr:0x2441d1d54e0
s2:To be or not to be, addr:0x2441d1d54e0
s3:To be or not to be, addr:0x2441d1df440
s1, s2, s3 모두 같은 문자열을 가지고 있으나 s3의 주소는 s1, s2와 다른 것을 확인 할 수 있다.
print(s1 == s3) # True
print(s1 is s3) # False
그럼 위 코드를 추가하여 다시 실행 시켜 보면 s1과 s3는 동일한 값을 가지고 있으므로 상등연산자(==)는 True를 리턴하지만 is연산자는 다른 객체를 가리키고 있으므로 False를 리턴한다.
이사으로 == 연산자와 is 연산자의 차이를 알아 보았으며 다음 강의 [Python] 파이썬 기초부터 시작하기 - mutable vs immutable 변수에서 파이썬 변수에 대해 다시 자세히 다뤄 보도록 하겠다.