Python

[Python] SyntaxWarning: "is" with a literal. Did you mean "=="? 에 대해서

ilovedigital 2024. 9. 5. 17:53

가끔 파이썬으로 코드를 작성하다보면 이런 경고문구를 볼 수가 있다.

 

그리고 알고리즘 공부나 문제를 파이썬으로 입문한 사람들은 이런 경고를 자주 보았을 것 같기도 하다.

 

해당 경고를 해석하자면 이렇다

 

"is" 를 지금 a 같은 문자열이나 숫자같은 리터럴 값과 사용하고 있는데
당신은 "==" 를 의도하고 사용한것이 아닌가요?



왜 이런 경고 문구를 띄워주냐면 "is" 와 "==" 는 차이가 있기 때문이다.

 

is 는 두 객체가 동일한 객체인지를 확인한다. 즉 메모리 상에서 같은 주소를 참조하는지 비교한다.

== 은 두 값이 같은 값인지만을 비교한다.

 

a = 'Tamako'

if a is 'Tamako':
    print('same')  # 경고 발생

if a == 'Tamako':
    print('same')  # 올바르게 비교하는 방법

 

 

가끔은 되는 이유

그런데 이런식으로 테스트 코드로 확인해보면 가끔 둘다 출력이 될 때가 있다.

 

"분명 a 와 'Tamako' 는 다른 객체이기 때문에 윗쪽의 same 은 출력이 되지 않아야할텐데?" 라고 생각을 하게 된다

 

근데 이것은 파이썬상에서 작은 정수(-5 ~ 256) 들이나 자주 나오게 되는 문자열들을 인터닝(interning) 이라는 메모리 최적화 기법을 사용할때도 있기 때문이다.

 

하지만 이러한 경우는 문자열의 길이나 형태, 정수의 크기에 따라 인터닝 되지 않을 수도 있기 때문에 모든 문자열이나 모든 정수가 같은 객체로 처리되지 않는다.

 

그렇기 때문에 파이썬에서는 의도치 않은 결과가 나올 수도 있기 때문에 is 키워드를 잘못 사용하였을 때 경고를 해주는 것이다.

 

 

정리

아마 자바 등의 언어들을 먼저 학습을 하고, 파이썬을 통해 코드를 짜게 된 분들이라면 이게 왜 이렇게 된건지 바로 아실것이다. (자바에서의 equls() 와 '==' 의 차이)

 

작성자 본인 같은 경우에는 파이썬과 프로그래밍 언어 전반에 대해 처음 배우게 되었을때, 파이썬의 이런 인간의 영어같은 형태에 신기해서 저런 방식을 남발하다 의도치 않은 결과를 얻은 적이 자주 있었다.

 

혹시나 예전의 나와 같은 사람들이 이 글을 보고 정보를 얻어갔으면 좋겠다.

 

참조 : Python Docs Expressions 파트 

6. Expressions — Python 3.12.5 documentation