is는 id()값을 비교하는 함수이다. None은 널(null)로서 값 자체가 정의되어 있지 않으므로 ==로 비교가 불가능하다.
주의할 점:
1. 값은 동일하지만 list()로 한 번 더 묶어주면, 별도의 객체로 복사가 되고 다른 ID를 갖게 된다. 따라서 is는 False가 된다.
a = [1,2,3]
print(a == copy.deepcopy(a))
>> True
print(a is copy.deepcopy(a))
>> False
2. copy.deepcopy()로 복사한 결과 값은 같지만 ID는 다르기 때문에, ==로 비교하면 True, is로 비교할 경우 False가 된다.
a = [1,2,3]
print(a == list(a))
>> True
print(a is list(a))
>> False
2020.08.31 추가:
파이썬에선 ==을 등가성(equality) 비교, is를 동일성(identitiy) 비교라 한다.
등가성 비교는 값이 같다면 True를 반환하지만, 동일성 비교는 값은 물론 객체의 식별 번호(id)까지 같아야 한다.
예전 Python에선 'python integar caching' 이라고 해서 -5부터 256 까지의 정수는 자주 쓰이기 때문에 사용자가 할당하지 않아도 할당되어 있었다.
a = 1
if a is 1:
print("성공!")
>>> 성공!
지금 Python은 확인 결과 257 이상의 정수에서도 작동하기 때문에 상관없긴 하다.
단, 이러한 문제가 발생할 수 있다는 여지가 남아 있기 때문에
if a is 1:
이러한 방식보단,
if a == 1:
을 지향하도록 하자.
'컴퓨터 > 파이썬 알고리즘 인터뷰' 카테고리의 다른 글
6. 문자열 슬라이싱 (0) | 2020.08.25 |
---|---|
5. Palindrome (0) | 2020.08.25 |
4. defaultdict 객체 (0) | 2020.08.25 |
2. pass (0) | 2020.08.24 |
1. print() (0) | 2020.08.24 |