[python] “foo is None”과“foo == None”사이에 차이점이 있습니까?

다음과 같은 차이점이 있습니까?

if foo is None: pass

if foo == None: pass

대부분의 Python 코드 (및 내가 직접 작성한 코드)에서 본 규칙은 전자이지만 최근에는 후자를 사용하는 코드를 발견했습니다. NoneType의 인스턴스 (및 유일한 인스턴스 인 IIRC)는 없습니다. 문제가되지 않습니까? 상황이있을 수 있습니까?



답변

isTrue동일한 객체 인스턴스를 비교하면 항상 반환

반면 ==최종적으로 결정되는 __eq__()방법


>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False


답변

객체의 아이덴티티와 동등성 을 읽을 수 있습니다 .

‘is’문은 객체 식별에 사용되며 객체가 동일한 인스턴스 (메모리의 동일한 주소)를 참조하는지 확인합니다.

그리고 ‘==’문은 동등 (동일한 값)을 나타냅니다.


답변

주의 사항 :

if foo:
  # do something

인가 되지 정확히 같은 :

if x is not None:
  # do something

전자는 부울 값 테스트이며 다른 상황에서 거짓으로 평가 될 수 있습니다. 빈 컨테이너, 부울 값과 같은 부울 값 테스트에서 거짓을 나타내는 여러 가지가 있습니다. 이 상황에서는 아무도 거짓으로 평가되지 않지만 다른 것들도 거짓으로 평가됩니다.


답변

(ob1 is ob2) 동일 (id(ob1) == id(ob2))


답변

그 이유 foo is None는 자신 __eq__을 정의하고 오브젝트를 없음과 동일하게 정의하는 오브젝트를 처리 할 수 ​​있기 때문에 선호되는 방법입니다 . 따라서 foo is None사실인지 확인해야 할 경우 항상 사용 하십시오 None.


답변

동일한 객체는 물론 동일하기 때문에 차이가 없습니다. 그러나 PEP 8 은 다음과 같이 사용해야합니다 is.

없음과 같은 싱글 톤과의 비교는 항상 평등 연산자를 사용하거나 수행하지 않아야합니다.


답변

is평등이 아닌 정체성을 테스트합니다 . 당신의 진술을 위해 foo is none, 파이썬은 단순히 객체의 메모리 주소를 비교합니다. “같은 객체에 대해 두 개의 이름이 있습니까?”라는 질문을합니다.

==다른 한편으로, __eq__()방법에 의해 결정된 평등을 시험한다 . 정체성에 관심이 없습니다.

In [102]: x, y, z = 2, 2, 2.0

In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)

In [104]: x is y
Out[104]: True

In [105]: x == y
Out[105]: True

In [106]: x is z
Out[106]: False

In [107]: x == z
Out[107]: True

None싱글 톤 연산자입니다. 그래서 None is None항상 사실이다.

In [101]: None is None
Out[101]: True