python에서 비교 연산자를 할 때 가장 많이 쓰는 것은 == 이다.
또 is를 쓸 수도 있다.
하지만 이번에 아무 생각 없이 is를 사용하였는데, 그냥 넘어가는 케이스가 있어서 당황하게 되었다.
예를 들어 설명해보면
if ga_uid is not 'anonymous':
print('here')
이런 경우 ga_uid에 분명 'anonymous'가 들어왔는데도
그냥 print문이 찍히게 되었다.
그래서 알아보니 is에 이런 설명이 있었다.
1. 'is'는 비교 연산자가 맞다. 하지만 중요한 건 변수의 값을 비교하는게 아니라 레퍼런스(C식으로 설명하자면 변수의 포인터)를 비교하는 연산자다.
2. Python의 변수는 내부적으로 데이터 그 자체를 가리키는게 아니라 인스턴스 포인터(값이 저장되어 있는 메모리의 주소, 즉 레퍼런스)를 가리킨다. 물론 C언어가 아니기 때문에 변수를 포인터처럼 엑세스 할 수는 없다.
이 말은 즉 memory에 올라간 주소를 체크한다는 것인데, 파이썬에서는 자주 쓰이는 것은 미리 memory에 올려놓고 사용한다.
따라서
a is a
True
라고 나온다. a는 파이썬에서 미리 memory에 올려놓았었기 떄문이다.
하지만 anonymous는 새롭게 memory에 올라가게 되고 이런 경우 ga_uid가 'anonymous'라고 해도 해당 부분에서 걸리지 못하게 되는 것이다.
따라서 is 커맨드는 되도록이면 None, True, False와 같은 것을 비교할 때만 하는게 좋을 것 같다.
그에 비해 ==은 정말 같은지를 비교하는 것이라 되도록 ==를 사용하는게 좋을 것 같다.
참고
: [[Python] 'is' 커맨드 - Seorenn SIGSEGV](http://seorenn.blogspot.com/2011/04/python-is.html)
: [operators - Python != operation vs "is not" - Stack Overflow](https://stackoverflow.com/questions/2209755/python-operation-vs-is-not)
'Python' 카테고리의 다른 글
openpyxl 활용하여 python xlsx 파일 만들기 (0) | 2020.06.20 |
---|---|
python 함수 timeout 설정하기 (0) | 2020.03.12 |
Python range, enumerate, zip, map, filter (0) | 2020.01.06 |
파이썬 25. 파이썬 인자 및 매개변수 (0) | 2019.12.29 |
파이썬 24. 파이썬 에러메시지(try, except, else, finally (0) | 2019.12.29 |