다음과 같은 차이점이 있습니까?
if foo is None: pass
과
if foo == None: pass
대부분의 Python 코드 (및 내가 직접 작성한 코드)에서 본 규칙은 전자이지만 최근에는 후자를 사용하는 코드를 발견했습니다. NoneType의 인스턴스 (및 유일한 인스턴스 인 IIRC)는 없습니다. 문제가되지 않습니까? 상황이있을 수 있습니까?
답변
is
True
동일한 객체 인스턴스를 비교하면 항상 반환
반면 ==
최종적으로 결정되는 __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