문제

다음 사이에 차이가 있습니까?

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가 없다면 :"라고 말하십시오.

몇 가지 자세한 내용 :

  1. 그만큼 is 조항은 실제로 두 사람이 확인합니다 objectS는 메모리 위치와 동일하거나 그렇지 않습니다. 즉 둘 다 같은 메모리 위치를 가리키고 동일하게 id.

  2. 1의 결과로 is 두 개의 어휘 표현 여부를 보장합니다. objects는 동일한 속성 (속성 속성 ...)이 있거나 그렇지 않습니다.

  3. 원시 유형의 인스턴스화 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top