복붙노트

[PYTHON] Python! = operation vs "is not"

PYTHON

Python! = operation vs "is not"

이 질문에 대한 의견에서 나는

result is not None

result != None

나는 그 차이점이 무엇인지 궁금해했고 왜 다른 사람보다 추천받을 수 있을까?

해결법

  1. ==============================

    1.== 평등성 테스트입니다. 오른쪽과 왼쪽이 같은 객체인지 확인합니다 (__eq__ 또는 __cmp__ 메서드에 따름).

    == 평등성 테스트입니다. 오른쪽과 왼쪽이 같은 객체인지 확인합니다 (__eq__ 또는 __cmp__ 메서드에 따름).

    is는 신분 확인 시험입니다. 오른손과 왼손이 아주 똑같은 대상인지 확인합니다. methodcall이 수행되지 않고 객체가 is 작업에 영향을 줄 수 없습니다.

    None과 같은 싱글 톤에 대해서는 None을, No로 가장 할 수있는 객체는 신경 쓰지 않습니다. None과 비교할 때 객체가 파괴되지 않도록 보호하고자하는 위치는 None입니다.

  2. ==============================

    2.먼저, 몇 가지 용어를 살펴 보겠습니다. 질문에 대한 대답을 원하면 "질문에 답변"으로 스크롤하십시오.

    먼저, 몇 가지 용어를 살펴 보겠습니다. 질문에 대한 대답을 원하면 "질문에 답변"으로 스크롤하십시오.

    오브젝트 ID : 오브젝트를 작성할 때이를 오브젝트에 지정할 수 있습니다. 그런 다음 다른 변수에 할당 할 수도 있습니다. 그리고 또 다른.

    >>> button = Button()
    >>> cancel = button
    >>> close = button
    >>> dismiss = button
    >>> print(cancel is close)
    True
    

    이 경우 cancel, close 및 dismiss는 모두 메모리에있는 동일한 객체를 참조합니다. 하나의 Button 객체 만 만들었고 세 변수 모두이 하나의 객체를 참조합니다. 우리는 cancel, close, dismiss가 모두 동일한 객체를 참조한다고 말합니다. 즉, 하나의 단일 객체를 참조합니다.

    객체 평등 : 두 객체를 비교할 때 일반적으로 객체가 메모리의 똑같은 객체를 참조하는지 상관하지 않습니다. 객체 평등을 사용하면 두 객체를 비교하는 방법에 대한 자체 규칙을 정의 할 수 있습니다. a == b :라고 쓰는 경우, 본질적으로 .__ eq __ (b) :인지 알려주고 있습니다. 이렇게하면 자신 만의 비교 로직을 사용할 수 있도록 __eq__ 메소드를 정의 할 수 있습니다.

    이론적 근거 : 두 객체는 ​​정확히 동일한 데이터를 가지고 있지만 동일하지는 않습니다. (이들은 메모리에있는 동일한 객체가 아닙니다.) 예 : 문자열

    >>> greeting = "It's a beautiful day in the neighbourhood."
    >>> a = unicode(greeting)
    >>> b = unicode(greeting)
    >>> a is b
    False
    >>> a == b
    True
    

    참고 : 파이썬은 메모리에 새로운 문자열을 만들지 않고도 일반 문자열을 재사용 할만큼 똑똑하기 때문에 여기서 유니 코드 문자열을 사용합니다.

    여기에 두 개의 유니 코드 문자열 인 a와 b가 있습니다. 그것들은 똑같은 내용을 가지고 있지만, 그들은 같은 기억의 대상이 아닙니다. 그러나 우리가 그들을 비교할 때, 우리는 그들이 평등을 비교하기를 원합니다. 여기서 일어나고있는 것은 유니 코드 객체가 __eq__ 메소드를 구현했다는 것입니다.

    class unicode(object):
        # ...
    
        def __eq__(self, other):
            if len(self) != len(other):
                return False
    
            for i, j in zip(self, other):
                if i != j:
                    return False
    
            return True
    

    참고 : 유니 코드의 __eq__은 이보다 효율적으로 구현됩니다.

    이론적 근거 : 두 개의 객체는 서로 다른 데이터를 가지지 만 일부 주요 데이터가 동일하면 동일한 객체로 간주됩니다. 예 : 대부분의 모델 데이터 유형

    >>> import datetime
    >>> a = Monitor()
    >>> a.make = "Dell"
    >>> a.model = "E770s"
    >>> a.owner = "Bob Jones"
    >>> a.warranty_expiration = datetime.date(2030, 12, 31)
    >>> b = Monitor()
    >>> b.make = "Dell"
    >>> b.model = "E770s"
    >>> b.owner = "Sam Johnson"
    >>> b.warranty_expiration = datetime.date(2005, 8, 22)
    >>> a is b
    False
    >>> a == b
    True
    

    여기에는 두 개의 Dell 모니터 인 a와 b가 있습니다. 그들은 동일한 제조사와 모델을 가지고 있습니다. 그러나 이들은 동일한 데이터를 가지지도 않으며 메모리에있는 동일한 객체도 아닙니다. 그러나 우리가 그들을 비교할 때, 우리는 그들이 평등을 비교하기를 원합니다. 여기서 일어나는 일은 Monitor 객체가 __eq__ 메소드를 구현했다는 것입니다.

    class Monitor(object):
        # ...
    
        def __eq__(self, other):
            return self.make == other.make and self.model == other.model
    

    없음과 비교할 때 항상 사용하지 않습니다. None은 파이썬에서 싱글 톤 (singleton)입니다 - 메모리에 오직 하나의 인스턴스 만 존재합니다.

    신분을 비교함으로써, 이것은 매우 빨리 수행 될 수 있습니다. 파이썬은 당신이 참조하고있는 객체가 전역 없음 객체와 동일한 메모리 주소를 가지고 있는지 검사합니다 - 두 개의 숫자를 매우 빠르게 비교합니다.

    평등을 비교함으로써, 파이썬은 여러분의 객체가 __eq__ 메소드를 가지고 있는지를 조사해야합니다. 그렇지 않으면 __eq__ 메소드를 찾는 각 수퍼 클래스를 검사합니다. 하나를 찾으면 파이썬이 그것을 호출합니다. __eq__ 메서드가 느리고 다른 개체가 없음이라는 것을 알게되면 즉시 반환하지 않는 경우 특히 위험합니다.

    __eq__을 구현하지 않았습니까? 그렇다면 파이썬은 아마도 객체에 대해 __eq__ 메쏘드를 찾아 대신 사용할 것입니다 - 어쨌든 객체의 신원을 검사합니다.

    파이썬에서 다른 것들을 비교할 때! =를 사용하게 될 것입니다.

  3. ==============================

    3.다음을 고려하세요:

    다음을 고려하세요:

    class Bad(object):
        def __eq__(self, other):
            return True
    
    c = Bad()
    c is None # False, equivalent to id(c) == id(None)
    c == None # True, equivalent to c.__eq__(None)
    
  4. ==============================

    4.None은 싱글 톤이므로 신원 비교는 항상 작동하지만 객체는 .__ eq __ ()를 통해 동등 비교를 위장 할 수 있습니다.

    None은 싱글 톤이므로 신원 비교는 항상 작동하지만 객체는 .__ eq __ ()를 통해 동등 비교를 위장 할 수 있습니다.

  5. ==============================

    5.

    >>> () is ()
    True
    >>> 1 is 1
    True
    >>> (1,) == (1,)
    True
    >>> (1,) is (1,)
    False
    >>> a = (1,)
    >>> b = a
    >>> a is b
    True
    

    어떤 객체는 싱글 톤이므로, 그것들과 함께 ==와 동일하다. 대부분은 그렇지 않습니다.

  6. from https://stackoverflow.com/questions/2209755/python-operation-vs-is-not by cc-by-sa and MIT license