programing

Python != 연산 vs "없음"

minecode 2023. 1. 4. 20:13
반응형

Python != 연산 vs "없음"

질문에 대한 코멘트에서, 나는 다음을 사용할 것을 권하는 문장을 보았다.

result is not None

result != None

어떤 차이가 있는지, 왜 둘 중 하나를 추천할 수 있는지 궁금했어요.

==동등성 테스트입니다.오른쪽과 왼쪽이 동일한 물체인지 여부를 확인합니다(그에 따라).__eq__ ★★★★★★★★★★★★★★★★★」__cmp__이치노

is아이덴티티 테스트입니다오른쪽과 왼쪽이 동일한 물체인지 확인합니다.메서드 콜은 실행되지 않습니다.오브젝트가 영향을 줄에 영향을 줄 수 없습니다.is★★★★★★ 。

은 you 다 you you youis (그리고)is not의 경우, 예를 「」등입니다None그런 것처럼 가장하고 싶어할 수 있는 오브젝트에는 관심이 없습니다.None입니다.None.

먼저 몇 가지 용어를 살펴보겠습니다.질문에 대한 답변만 원하는 경우 아래로 스크롤하여 "질문에 대한 답변"을 확인하십시오.

정의들

개체 ID:개체를 생성할 때 변수에 개체를 할당할 수 있습니다.그런 다음 다른 변수에 할당할 수도 있습니다.그리고 또 하나.

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

「」는,cancel,close , , , , 입니다.dismiss모두 메모리내의 같은 오브젝트를 참조합니다.요.Button세 이 object.object를 합니다..cancel,close , , , , 입니다.dismiss모두 동일한 오브젝트, 즉 단일 오브젝트를 참조합니다.

오브젝트 동등성:두 개체를 비교할 때 일반적으로 메모리 내의 동일한 개체를 참조하는 것은 상관하지 않습니다.개체가 동일한 경우 두 개체가 비교하는 방법에 대한 고유한 규칙을 정의할 수 있습니다.글을 쓸 때if a == b: 기본적으로는 '네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네, 네.if a.__eq__(b): 을 할 수 __eq__의 메서드입니다.a자기만의 비교 논리를 사용할 수 있도록 하는 것입니다.

동등 비교의 근거

근거:두 개체는 데이터는 동일하지만 동일하지는 않습니다.(이것들은 메모리 내의 같은 객체가 아닙니다).예:줄들

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

주의: Python은 메모리에 새로운 문자열을 만들지 않고도 일반 문자열을 재사용할 수 있기 때문에 유니코드 문자열을 사용합니다.

에서는 문자열이 .「 」 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__unicode확실히, 이것보다 효율적으로 실장되고 있습니다.

근거:두 개체는 서로 다른 데이터를 가지고 있지만 일부 키 데이터가 동일한 경우 동일한 개체로 간주됩니다.예:대부분의 모형 데이터 유형

>>> 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

여기 델제 모니터가 2대 있어요.a그리고.b제조사와 모델은 동일합니다.그러나, 이 두 가지는 같은 데이터를 가지고 있지 않고, 메모리상의 같은 오브젝트도 아닙니다.그러나 비교할 때 동등하게 비교했으면 합니다.여기서 일어나고 있는 것은 모니터 객체가 구현된 것입니다.__eq__방법.

class Monitor(object):
    # ...

    def __eq__(self, other):
        return self.make == other.make and self.model == other.model

질문에 대한 답변

와 비교하면None, 항상 사용is notPython에서는 싱글톤이 아닙니다.메모리에는 인스턴스가 1개밖에 없습니다.

아이덴티티를 비교함으로써 매우 빠르게 실행할 수 있습니다.Python은 참조하는 객체가 글로벌 None 객체와 동일한 메모리 주소를 가지고 있는지 여부를 확인합니다.이것에 의해, 2개의 번호를 매우 빠르게 비교할 수 있습니다.

동등성을 비교함으로써 Python은 당신의 객체가 다음을 가지고 있는지 조사해야 합니다.__eq__방법.그렇지 않은 경우 각 슈퍼클래스를 검사하고,__eq__방법.하나 찾으면 Python이 호출합니다.이것은 특히 나쁜 경우입니다.__eq__메서드는 느리고 다른 오브젝트가 다음과 같은 것을 인식해도 즉시 반환되지 않습니다.None.

★★★★★★★★★★★★★★★는 실장하지 않았습니까?__eq__ Python은 아마도 Python을 수 있을 __eq__의 메서드입니다.object아이디입니다.

때 Python을 .!=.

다음 사항을 고려하십시오.

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)

None.__eq__().

( )는 ( )입니다.진실의>> 1은 1진실의>> (1, ) == (1, )진실의>> (1, )는 (1, )거짓의a = (1, )>> b = aa는 b입니다.진실의

중에는 이 있는 것도 '싱글톤입니다.is라면 그들entent with with with with 에 해당한다.==대부분은 그렇지 않다.

언급URL : https://stackoverflow.com/questions/2209755/python-operation-vs-is-not

반응형