Python의 객체 비교 작업==와 is의 차이점 분석

앞말


Python의 객체 비교에는 = 및 is 두 가지 방법이 있습니다.두 가지 방식 모두 조작부 양측의 변수 값이 같은지 아닌지를 판단할 수 있다. 그렇다면 그것들의 차이는 무엇일까?아래의 소개를 통해 우리는 결말을 알아보자.
비교 연산자는 일반적으로 다음 예제에서 조건문에 사용됩니다.

if a == b:
 pass

if a is False:
 pass

== is와의 차이


= = 작업자는 객체의 값이 동일한지 비교합니다.샤오밍은 롤렉스 시계가 하나 있고, 샤오리도 같은 롤렉스 시계가 하나 있는데, 이때 우리는 이 두 시계가 같다고 생각했다.
시아오밍의 시계
이 군의 손목시계
시아오밍의 시계
is 조작부호는 대상의 신분 표지가 같은지, 즉 대상이 메모리에 있는 주소가 같은지, 두 대상의 신분 표지가 같으면 같은 대상이라는 것을 비교한다.시아오밍의 아버지는 시아오밍을 아들이라고 부르고 시아오밍의 여자친구는 시아오밍을 남편이라고 부른다. 그러나 이 두 호칭은 모두 시아오밍이라는 사람을 대표한다. 즉, 같은 대상이다.
아버지 의 아들
여자 친구 의 남편
아빠 아들 is 여자친구 남편
다음은 코드로 ==와 is의 차이를 보여 드리겠습니다.

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a == b
True
>>> a is b
False
>>> id(a)
24603664
>>> id(b)
24603144

>>> a = [1, 2, 3]
>>> b = a
>>> a == b
True
>>> a is b
True
>>> id(a)
24604144
>>> id(b)
24604144
Python에서 id 함수는 매개 변수로 대상을 수신하고 메모리에 있는 주소를 되돌려줍니다.
상기 코드에서 분석할 수 있듯이 == 조작부호는 두 대상의 값이 같은지만 비교하지만 두 대상이 같은 대상인지는 비교하지 않는다.한편, is 조작부호는 두 대상의 값이 같은지 비교하는 것이 아니라 두 대상이 같은 대상인지, 같은 대상이라면 그들의 값이 자연히 같은지 확인한다.

Python 작은 정수 개체 풀


상기 두 단락의 코드는 이미 ==와 is의 차이를 나타낼 수 있으나Python에도 특수한 상황이 있다. 아래의 예를 보면 다음과 같다.

>>> a = 5
>>> b = 5
>>> a == b
True
>>> a is b
True
>>> id(a)
1730274128
>>> id(b)
1730274128

>>> a = 257
>>> b = 257
>>> a == b
True
>>> a is b
False
>>> id(a)
48558688
>>> id(b)
48558720
상기 코드는 보기에 매우 괴이하다. 같은 비교 조작은 숫자만 바꾸면 결과가 다르다.
사실 위의 결과가 나온 원인은 파이썬 자신에 있다.Python은 성능을 고려하여 해석기를 시작할 때 -5에서 256의 정수를 메모리에 만들었습니다.값이 -5에서 256까지의 int 숫자를 만들어야 할 때,Python은 숫자를 만들기 위해 메모리를 새로 열지 않고 존재하는 대상을 되돌려줍니다.
그러나 새로 만든 숫자가 이 범위에 있지 않으면,Python은 모든 변수를 위해 단독 메모리 공간을 열 것입니다.

Python intern 메커니즘


다음 문자열 비교의 예를 살펴보겠습니다.

>>> a = 'hello world'
>>> b = 'hello world'
>>> a == b
True
>>> a is b
False
>>> id(a)
49465408
>>> id(b)
49465448

>>> a = 'hello'
>>> b = 'hello'
>>> a == b
True
>>> a is b
True
>>> id(a)
49429152
>>> id(b)
49429152
틀림없이 이전의 숫자를 비교한 예에 근거하여 너는 아마도 상기 코드의 결과가 다른 원인을 추측할 수 있을 것이다.사실상, 상기 결과도 마찬가지로 Python은 성능에 대한 고려에서 나온 것이지만, 이번 Python은 Hello 문자열을 메모리에 미리 만들지 않고 intern이라는 메커니즘을 사용했다.
intern 메커니즘에 관해서 우리는 깊이 연구하지 않고 앞으로 전문적으로 블로그를 써서 소개할 기회가 있을 것이다.한 마디로 하면 어떤 장면에서Python은 문자열에 인터n 메커니즘을 열어 성능을 향상시키고 상기 예시 코드의 결과를 초래할 수 있다는 것을 알아야 한다.

== is와 각각의 적용 장면


언제 쓰나요===, 언제 쓰나요 is?
우리가 하나의 변수와 하나의 예를 비교해야 할 때, 반드시 is를 사용해야 하며, 다른 상황은 통상적으로 ==를 사용해야 한다.
예를 들어 변수를 가지고 True나 False와 비교할 때 is를 사용해야 한다. 왜냐하면 is를 사용하는 비교의 속도는 ==보다 빠르기 때문이다.
is로 대상을 비교할 때, 그것들이 같은 메모리 주소에 있는지 판단하기만 하면 되고, ==로 비교적 느린 이유는 ==로 대상을 비교할 때 대상의 __를 호출하기 때문이다.eq__() 메서드, 그리고 __eq__() 방법은 일반적으로 다시 불러오기 때문에 내부 논리를 실행하는 데 시간이 좀 더 걸린다.
다음은 객체 재부팅 _eq__() 메서드의 예:

class MyList(object):
  def __init__(self, *args):
    self._list = [*args]

  def __eq__(self, other):
    result = False
    for i in self._list:
      for j in other._list:
        if i == j:
          break
      else:
        break
    else:
      result = True
    return result

li_1 = MyList(1, 2, 3)
li_2 = MyList(1, 2, 3)
print(li_1 == li_2) # True
당신은 스스로 수정을 시도할 수 있습니다__eq__() 방법 내부의 논리로 그 결과를 관찰한다.

총결산


이 Python의 대상에 대한 비교 조작==와 is의 글은 여기까지 소개합니다. 더 많은 Python 대상과 비교 조작==와 is 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기