"foo is none"과 "foo == none"사이에 차이가 있습니까?
-
09-06-2019 - |
문제
다음 사이에 차이가 있습니까?
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 또는 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
아무도 평등 (==)과 정체성 (IS) 사이에 차이가 없어야합니다. 비에 타이프는 아마도 평등을 위해 신원을 반환 할 것입니다. 비에 타이프를 만들 수있는 유일한 인스턴스는 없기 때문에 (사실이라고 생각합니다) 두 작업은 동일합니다. 다른 유형의 경우 항상 그런 것은 아닙니다. 예를 들어:
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)을 진정으로 나타내지 않는 한 "Foo :"을 사용하는 것을 좋아하지 않습니다. Foo가 끈이나 물체 또는 다른 것인 경우 "Foo :"Foo : "작동 할 수 있지만 게으른 지름길처럼 보입니다. x가 없음을 확인하는 경우 "x가 없다면 :"라고 말하십시오.
몇 가지 자세한 내용 :
그만큼
is
조항은 실제로 두 사람이 확인합니다object
S는 메모리 위치와 동일하거나 그렇지 않습니다. 즉 둘 다 같은 메모리 위치를 가리키고 동일하게id
.1의 결과로
is
두 개의 어휘 표현 여부를 보장합니다.object
s는 동일한 속성 (속성 속성 ...)이 있거나 그렇지 않습니다.원시 유형의 인스턴스화
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
파이썬의 "룩업"테이블에 하나의 인스턴스를 가질 수 있으므로 전자와 후자는 코드를 작성한 개발자의 프로그래밍 스타일에 더 가깝습니다 (일관성을 위해) 하나를 선택할 수있는 미묘한 논리적 이유가 있습니다. 다른쪽에.
John Machin의 결론 None
싱글 톤은이 코드에 의해 강화 된 결론입니다.
>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>>
부터 None
싱글 톤, x == None
그리고 x is None
동일한 결과를 얻을 수 있습니다. 그러나 내 미학적 견해로는 x == None
최고.
a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence
a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True