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)

+ Recent posts