is
-식별 연산자(identity operator)로서 값이 아닌 주소를 비교한다.
==
-비교 연산자로서 값을 비교한다.
예시
n1 = 257
n2 = 257
s1 = "duck"
s2 = "duck"
print(n1 == n2)
print(n1 is n2)
print(s1 == s2)
print(s1 is s2)
>>True
>>True
>>True
>>True
n1 = 257
n2 = 256
s1 = "duck"
s2 = "duc"
print(n1 == n2+1)
print(n1 is n2+1)
print(s1 == (s2+'k'))
print(s1 is (s2+'k'))
>>True
>>False
>>True
>>False
위의 예시는 모두 True가 나온 것을 볼 수 있고
아래의 예시는 is 연산에서 False가 나온 것을 볼 수 있다.
파이썬은 새로운 변수에 할당하려는 값이 이미 메모리에 존재하면 새로운 값을 생성하지 않고
기존에 존재하는 메모리를 가리키게 한다.
아래의 예시를 보면
연산의 값은 257, duck 둘 다 동일하나 n1과 n2(s1과 s2)가 가리키는 메모리 주소가 다르기 때문에 is연산에서는 False가 반환되는 것을 볼 수 있다.
n1 = 257
n2 = 256
s1 = "duck"
s2 = "duc"
print(id(n1))
print(id(n2+1))
print(id(s1))
print(id(s2+'k'))
>>1356657452880
>>1356657452464
>>1356657710840
>>1356686985848
#메모리 주소값이 다른 것을 확인할 수 있다.
※예시와 다르게 257보다 작은 양의 정수를 사용하면 is연산을 해도 True값이 나오는 것을 볼 수 있다.
Python은 자주 사용되는 작은 정수, [-5,256] 범위의 정수들을 미리 캐싱해놓기 때문에 해당 범위의 값은 항상 같은 주 소를 가리킨다.
'Python' 카테고리의 다른 글
Python - 딕셔너리 키(key), 값(value) 도치 (0) | 2020.08.04 |
---|---|
Python - with 문 (0) | 2020.08.01 |
Python - 에일리어스(alias) (0) | 2020.07.29 |
Python - 모듈(module) (0) | 2020.07.27 |
Python - 단락 평가(Short-circuit Evaluation) (0) | 2020.07.26 |