"is None"과 "== None"의 차이점은 무엇입니까


324

나는 최근 에이 구문을 보았지만 차이점을 알지 못했습니다.

누군가가 그 차이를 말해 줄 수 있다면 고맙겠습니다.



1
이것이 귀하의 질문에 대답합니까? "=="와 "is"사이에 차이가 있습니까?
6월

이 질문이 isvs ==에 관한 것인지, 또는 정확히 무엇이 무엇이고 어떤 None상황에서 행동이 어떻게 다른지에 대한 것이 확실하지 않습니다 (후자는 내가 여기서 끝내게 된 이유입니다). 모호함과 OP 응답의 부족을 바탕으로 ... 이로 인해 많은 찬사를받는 것에 놀랐습니다. 내 말은 ... cmon ... 질문은 실제 질문에도 쓰여지지 않았습니다 ...
RTbecard

답변:


291

대답은 여기 에 설명되어 있습니다 .

인용 :

클래스는 원하는 방식으로 비교를 자유롭게 구현할 수 있으며 None과 비교할 수 있습니다. 그 자체로?).

실제로 말하면, 커스텀 비교 연산자가 드물기 때문에 큰 차이가 없습니다. 그러나 is None일반적인 규칙으로 사용해야합니다 .


57
또한 :) is None보다 조금 (~ 50 %) 빠릅니다.== None
Nas Banov

26
@ myusuf3 : >>> timeit.Timer ( '없음은 없음') .timeit () | 0.225 | >>> timeit.Timer ( '없음 == 없음') .timeit () | 0.328
Nas Banov

9
@ myusuf3 당신은 그것에 대한 증거가 실제로 필요하지 않습니다. is기본적으로 정수 비교 ==는 참조를 해결하는 것뿐만 아니라 유형이 일치하지 않는 값을 비교하는 것입니다.
Pijusn

4
하나는 "is"를 선호합니다. 변수가 None이거나 None과 의미있는 비교가없는 경우 예를 들어, 변수는 numpy.array 또는 None (나의 경우) 일 수 있습니다.
Jblasco

3
@TimLudwinski의 말에 덧붙이고 싶습니다 : 첫째, 누군가가 평등 연산자를 무시하여 특별한 경우를 만들지 않는다면 왜 다른 이유를 말하고 싶습니까? 둘째, "한 가지 분명한 방법이 있어야합니다." 그리고 무언가가 무언가와 같은지 확인하는 확실한 방법은 평등 연산자입니다.
Yuval

162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False

56

이 경우에는 동일합니다. None은 단일 객체입니다 (단 하나만 존재합니다 None).

is 객체가 동일한 객체인지 확인하고 ==는 동일한 객체인지 확인합니다.

예를 들면 다음과 같습니다.

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

그러나 하나만 있기 때문에 None항상 동일하며 isTrue를 반환합니다.

p = None
q = None
p is q # True because they are both pointing to the same "None"

17
이 답변은 stackoverflow.com/questions/3257919/is-none-vs-none/… 아래의 Ben Hoffstein의 답변에 설명 된대로 정확하지 않습니다 . x == None는 자체 맞춤 평등 연산자가있는 일부 클래스의 인스턴스 가 아닌 True경우에도 평가 될 수 있습니다 . xNone
최대

5

numpy를 사용하면

if np.zeros(3)==None: pass

numpy가 요소별로 비교할 때 오류가 발생합니다.


3

없음과 비교하는 내용에 따라 다릅니다. 일부 클래스에는와 == None다르게 취급되는 사용자 정의 비교 방법이 있습니다 is None.

특히 출력은 a == None 부울 일 필요는 없습니다 !! -버그의 빈번한 원인.

특정 예제의 경우 ==비교가 요소별로 구현 되는 numpy 배열을 사용하십시오 .

import numpy as np
a = np.zeros(3) # now a is array([0., 0., 0.])
a == None #compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a is None #compares object to object, outputs False
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.