파이썬 없음 비교 : "is"또는 ==를 사용해야합니까?


213

비교할 때 편집자가 경고를 my_var == None표시하지만 사용할 때는 경고가 표시되지 않습니다 my_var is None.

파이썬 셸에서 테스트를 수행하고 둘 다 유효한 구문인지 확인했지만 편집자 my_var is None가 선호 한다고 말하고있는 것 같습니다 .

이것이 사실입니까, 그렇다면 왜 그렇습니까?


7
PEP 8은 사용 싱글로 비교해야 어딘가에 말한다 is- python.org/dev/peps/pep-0008/#programming-recommendations
변동성을

2
그 포스터는 파이썬 3에 대해 이야기하고 있으며, 제 질문은 파이썬 2.x에 관한 것입니다. 이것이 둘 다를 보장하기에 충분히 큰 차이인지 확실하지 않지만 경우에 따라 포함하도록 질문을 편집했습니다.
Clay Wardell

2
나는이 질문이 실제로 중복이라고 생각하지 않습니다. 다른 하나는 일반적으로 == 대였으며, 이것은 특히 None에 관한 것입니다.
IJ 케네디

답변:


254

요약:

is객체의 아이덴티티 를 검사하려는 경우에 사용하십시오 (예 : varis 인지 확인 None). 평등== 을 확인하려는 경우에 사용하십시오 (예 :?와 같음 ).var3

설명:

당신 my_var == None은 반환 할 사용자 정의 클래스를 가질 수 있습니다True

예 :

class Negator(object):
    def __eq__(self,other):
        return not other

thing = Negator()
print thing == None    #True
print thing is None    #False

is객체 아이덴티티를 확인 합니다. 하나의 객체 만 None있으므로 수행 할 때 my_var is None실제로 동일한 객체 ( 동등한 객체가 아닌)인지 확인합니다

다시 말해 ==동등성 검사 (객체마다 정의 됨)이지만 is객체 동일성을 검사합니다.

lst = [1,2,3]
lst == lst[:]  # This is True since the lists are "equivalent"
lst is lst[:]  # This is False since they're actually different objects

22
언제 is None와 다릅니 == None까?
Blender

11
@Blender 언급 된 경우. __eq__어떤 식 으로든 정의 할 수 있지만 동작을 is쉽게 변경할 수는 없습니다.
Lev Levitsky

5
@LevLevitsky : Mython의 사용 사례 중 하나는 "프로토콜을 확장하여 어떤 연산자라도 오버로드 될 수 있습니다 is"입니다. 목록에 댓글 후, 그는 그, 변경 "...도 is(만있는 거 미친 당신에게있는 경우)."
abarnert

1
+1이지만,이 답변에 다른 사람들이하는 PEP 8 레퍼런스가 포함되어 있다면 더 좋을 것입니다.
abarnert

3
@abarnert-나는 PEP 8이 여기에서 권장 사항을 만들었다는 사실조차 알지 못했습니다. 요점은 그들이 다른 일을하는 다른 연산자라는 것입니다. 경우가있을 수 있습니다 object == None사실 이다 (I 내 머리 위로 떨어져 어떤 생각할 수 없다하더라도) 올바른 관용구. 당신은 당신이하고있는 일을 알아야합니다.
mgilson

127

is일반적으로 임의의 객체를 싱글 톤과 비교할 때 None더 빠르고 예측 가능하기 때문에 선호됩니다 . 피연산자의 정확한 유형과 심지어 순서에 따라 달라지는 is반면 항상 개체 ID로 비교합니다 ==.

이 권장 사항은 PEP 8에 의해 지원되는데 , 이는 "없음과 같은 싱글 톤과의 비교는 항상 항등 연산자를 사용하지 않고 또는 로 수행해야합니다"라고 명시 적으로 명시 하고 있습니다 .isis not


6
이것을 게시 해 주셔서 감사합니다. 허용되는 답변은 몇 가지 흥미로운 점을 제시하지만 귀하의 질문에 대한 답변은 훨씬 더 직접적입니다.
Luke Davis

본질적으로 구현 세부 사항에 의존하는 것이 이상하게 보입니다. NoneType의 인스턴스가 몇 개인 지 왜 신경 써야합니까?
BallpointBen

그건 때문에 @BallpointBen 하지 구현 세부 - 하나가 None글로벌 상수에서 객체 None. 어떤 경우는 NoneType때문에 구현 세부 사항은 None싱글이 있어야합니다 몇 가지 유형입니다. (이 유형의 인스턴스를 만들 수 없다는 사실은 해당 인스턴스가 단일 인스턴스라는 것을 나타내는 좋은 증거입니다.)
user4815162342

@BallpointBen 핵심은 파이썬이 강력한 객체 아이덴티티 개념을 가지고 있다는 것입니다. 객체가 비교 여부를 확인하려면 동일한 대상을 None모든 수단을 사용하여 obj == None. 객체 있는지 확인하려면을 None사용하십시오 obj is None. PEP 8 권장 사항 (및이 답변)의 요점은 대부분의 사람들이 없음을 확인하려고 할 때 후자를 원한다는 것입니다. 또한 더 빠르고 명확합니다.
user4815162342

None0캐싱이 실제로 구현 세부 사항 인 캐시 된 객체와 같은 다른 작은 정수와 도 다릅니다 . 차이점은 정수에는 속성을 제공하는 고유 값이 있으며 계산할 수 있다는 것입니다. 다른 한편으로, None어떤 국가도 존재하지 않는 것은 중요하고 그것을 특별하게 만드는 것은 그 정체성 뿐입니다 .
user4815162342

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.