답변:
is
True
동일한 객체 인스턴스를 비교하면 항상 반환
반면 ==
최종적으로 결정되는 __eq__()
방법
즉
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == None
True
>>> f is None
False
is
연산자를 사용자 정의 할 수 없도록 추가 할 수도 있습니다 (사용자 정의 클래스에 의해 오버로드 됨).
__eq__(self)
는 ==
Python 객체에서 사용될 때 처리 방법을 결정하는 특수 내장 메소드입니다 . 여기서는 ==
유형의 객체에 사용될 때 Foo
항상 true를 반환 하도록 재정의했습니다 . is
연산자 에는 동등한 방법이 없으므로 같은 방식으로 동작을 is
변경할 수 없습니다.
이 객체의 아이덴티티와 동등성 을 읽을 수 있습니다 .
'is'문은 객체 식별에 사용되며 객체가 동일한 인스턴스 (메모리의 동일한 주소)를 참조하는지 확인합니다.
그리고 '=='문은 동등 (동일한 값)을 나타냅니다.
a=1;b=1;print(a is b) # True
. a is b
그들이 2 개의 다른 객체 (메모리의 다른 주소) 인 것처럼 보이지만 왜 사실로 판명됩니까?
(ob1 is ob2)
동일 (id(ob1) == id(ob2))
is
버전은 더 함수 호출, 그리고 전혀 파이썬 인터프리터 속성 조회를 필요로하지 않는다; ob1이 실제로 ob2이면 인터프리터는 즉시 응답 할 수 있습니다.
{} is {}
거짓과 id({}) == id({})
할 수있다 (그리고 있다 CPython의에서) 사실. 참조 stackoverflow.com/questions/3877230
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
None의 경우 동등성 (==)과 동일성 (is)간에 차이가 없어야합니다. NoneType은 아마도 동일성을 위해 동일성을 반환합니다. None은 NoneType으로 만들 수있는 유일한 인스턴스이므로 (이것이 사실이라고 생각합니다) 두 작업은 동일합니다. 다른 유형의 경우 항상 그런 것은 아닙니다. 예를 들면 다음과 같습니다.
list1 = [1, 2, 3]
list2 = [1, 2, 3]
if list1==list2: print "Equal"
if list1 is list2: print "Same"
리스트에 기본 아이디 반환이 아닌 비교 연산이 있으므로 "같음"으로 표시됩니다.
@ 제이슨 :
나는 라인을 따라 더 많은 것을 사용하는 것이 좋습니다
if foo: #foo isn't None else: #foo is None
foo가 실제로 부울 값 (예 : 0 또는 1)을 나타내지 않는 한 "if foo :"를 사용하는 것을 좋아하지 않습니다. foo가 문자열이나 객체 또는 다른 것이라면 "if foo :"가 작동 할 수 있지만 게으른 지름길처럼 보입니다. x가 없음인지 확인하려면 "x가 없음 인 경우 :"라고 말합니다.
if foo
거짓을 반환하고 주석 #foo is None
이 잘못되었습니다.
더 자세한 내용은 :
이 is
절은 실제로 두 개의 object
메모리 위치가 같은지 여부를 확인합니다 . 즉, 둘 다 동일한 메모리 위치를 가리키고 동일한 지 여부 id
입니다.
1의 결과로 is
, 두 어휘 표현 object
이 동일한 속성 (속성 속성 ...) 을 갖는지 여부를 보장합니다.
같은 원시 타입의 인스턴스는 bool
, int
, string
(일부 예외), NoneType
동일한 값을 갖는 것은 항상 동일한 메모리 위치에있을 것이다.
예 :
>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True
그리고 NoneType
파이썬의 "look-up"테이블에 하나의 인스턴스 만 가질 수 있기 때문에 전자와 후자는 코드를 작성한 개발자의 프로그래밍 스타일에 더 가깝습니다. 다른 하나를 선택하십시오.
some_string is "bar"
문자열을 비교 하는 데 사용하지 마십시오 . 그렇게하는 단일 수락 가능한 이유가 없으며, 예상치 못한 경우 중단됩니다. CPython은 내용이 동일한 두 개의 불변 객체를 만드는 것이 어리 석다는 것을 알고 있기 때문에 종종 작동한다는 사실이 간단합니다. 그럼에도 불구하고 일어날 수 있습니다.
int
.
None
싱글 톤 이라는 John Machin의 결론 은이 코드에 의해 강화 된 결론입니다.
>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>>
이후로는 None
싱글 톤, x == None
그리고 x is None
같은 결과를 가질 것이다. 그러나 내 미적 견해로 x == None
는 최고입니다.
None
객체 가 정확히 객체입니다. 비교해 볼 때, False
다른 가치관이 진실 이라는 것을 제외하고 다른 맥락에서는 아무도 사용하지 않는 경우가 거의 없습니다 . 이 경우 다음과 같은 작업을 수행하는 것이 관용적입니다.if x: pass