\ x is y 가 true가 되기 위한 조건은 각 변수의 id값이 같으면 True가 되기도 합니다. id 함수를 써서 각 변수들의 id를 출력하여 비교해보면 아래와 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12
a = [1,2,3] b = [1,2,3] c = a # a와 b는 담고 있는 값들이 서로 같으나, 메모리 위치가 서로 다릅니다. print(id(a), id(b)) #1979894037248 1979890500992 print(a == b) #True print(a is b) #False
# a와 b는 서로 같은 곳을 바라보고 있습니다. print(id(a), id(c)) #1979894037248 1979894037248 print(a == c) #True print(a is c) #True
예외 케이스 : 정수형 값
위에 따르면, 아래 코드는 True, True가 나와야 정상입니다. 왜냐하면 a, b가 각각의 메모리를 할당받고, 각 메모리에 10이라는 값이 들어가게 되기 때문입니다.
1 2 3 4
a = 10 b = 10 print(a == b) print(a is b)
그러나 결과는 True, True입니다. 왜 그럴까요? 파이썬에서 메모리 최적화를 위해, -5부터 256까지는 파이썬에서 캐싱하는 싱글턴 오브젝트를 사용하기 때문입니다. 따라서 아래와 같은 코드를 작성하여 실행해보면,
1 2 3 4 5 6 7
for i inrange(-10, 0): a = i print("%i: %s" % (i, a isint(str(i))))
for i inrange(250, 260): a = i print("%i: %s" % (i, a isint(str(i))))
python에서는 nan이라는 null과 유사한 객체종류가 있습니다. 이에 대해서는 아래와 같은 결과가 나옵니다.
1 2 3 4
nan = float('nan')
print(nan is nan) #True print(nan == nan) #False
nan인지를 체크하기 위해서는 대표적으로 numpy.isnan 메소드를 쓰는 방식이 있습니다.
아래와 같은 방식으로 사용할 수 있습니다.
1 2 3 4
import numpy as np
if np.isnan(value) : print('nan')
각 자료형에 대한 is 확인 결과
각 자료형에 대한 is를 확인해보면 아래와 같습니다. list, dictionary에 대해서만 다른 메모리값을 가르키는것을 확인할 수 있었습니다. 아래 결과에서 a is b 가 True가 나오는 점을 미루어 보아, python 내부적으로 리터럴값을 가리키면 최적화를 하는것으로 보입니다.