[Python] Difference between '==' and 'is'
by Jeonghyeok Park
안녕하세요.
오늘 소개해드릴 내용은 ==
와 is
입니다.
이번에 새로운 논문 관련해서 코드 작성하면서.. ==와 is를 동일 취급하고 무분별하게 사용을 한 대가를 혹독히 받았습니다.
약 4~5일 간 훈련이 완료된 모델들을 모두 처음부터 다시 훈련해야하는 참담한..
잘못된 부분을 찾고 그 차이를 명확하게 하기 위해 찾아보니 이미 많은 분들이 이 차이에 대해서 포스팅을 했더라구요.. 한 번이라도 봤으면 이렇게 시간을 날리지 않았을 텐데 아쉽습니다.
반성하고 기억하자는 의미에서 이 포스팅을 작성합니다.
대부분의 경우, 동일시 취급되어 사용되어도 무방할 수 있으나 그 차이를 아는 것은 중요할 것 같습니다.
**is**
operator defines if both the variables point to the same object whereas the**==**
sign checks if the values for the two variables are the same.
is
는 variables point (레퍼런스가 같냐?)
==
는 variables (값이 같냐?)
예시를 들어가며 확인해보겠습니다.
[Code]
list1 = [1,2,3]
list2 = [1,2,3]
list3=list1
if (list1 == list2):
print("True")
else:
print("False")
if (list1 == list3):
print("True")
else:
print("False")
if (list1 is list2):
print("True")
else:
print("False")
if (list1 is list3):
print("True")
else:
print("False")
print(id(list1), id(list2), id(list3))
[Output]
True
True
False
True
2193515359944 2193515360136 2193515359944
list1과 list2는 내용물은 같지만, 가르키는 레퍼런스가 다릅니다. 따라서 is를 사용하면 False가 출력됩니다.
이번엔 list말고 str로 해보겠습니다.
[Code]
str1 = "abc"
str2 = "abc"
str3 = str1
if (str1 == str2):
print("True")
else:
print("False")
if (str1 == str3):
print("True")
else:
print("False")
if (str1 is str2):
print("True")
else:
print("False")
if (str1 is str3):
print("True")
else:
print("False")
print(id(str1), id(str2), id(str3))
[Output]
True
True
True
True
2193446747304 2193446747304 2193446747304
이 예시에서는 str1과 str2가 같은 레퍼런스를 가르킵니다. (효율을 위해)
하지만 아래의 예시처럼 문자열의 길이가 길어지면,
[Code]
str1 = "I love you"
str2 = "I love you"
str3 = str1
if (str1 == str2):
print("True")
else:
print("False")
if (str1 == str3):
print("True")
else:
print("False")
if (str1 is str2):
print("True")
else:
print("False")
if (str1 is str3):
print("True")
else:
print("False")
print(id(str1), id(str2), id(str3))
[Output]
True
True
False
True
2193514967856 2193515407664 2193514967856
list의 예시와 마찬가지로 str1과 str2가 다른 레퍼런스를 가르킵니다.
결론적으로 생각없이 사용할 때는 == 를 사용하는 것이 좋은 것 같습니다. python을 주로 사용하게 되면서 C에서 배운 포인터의 개념조차 가물가물하고 주로 value 비교를 해야하는 상황이 많기 때문에 is는 None, True, False인지를 확인할 때 사용하면 될 것 같습니다.
이번 포스팅은 여기까지입니다.
감사합니다.
Subscribe via RSS