복붙노트

[PYTHON] 파이썬에서 "a is b"와 "id (a) == id (b)"의 차이점은 무엇입니까?

PYTHON

파이썬에서 "a is b"와 "id (a) == id (b)"의 차이점은 무엇입니까?

id () inbuilt 함수는 다음을 제공합니다.

대신에, 연산자가 제공합니다 ...

그렇다면 동일한 ID를 가진 두 객체를 가질 수는 있지만 왜 False를 반환 할 수 있습니까? 다음은 그 예입니다.

>>> class Test():
...   def test():
...     pass
>>> a = Test()
>>> b = Test()
>>> id(a.test) == id(b.test)
True
>>> a.test is b.test
False

더 문제가되는 예 : (계속)

>>> b = a
>>> b is a
True
>>> b.test is a.test
False
>>> a.test is a.test
False

하나:

>>> new_improved_test_method = lambda: None
>>> a.test = new_improved_test_method
>>> a.test is a.test
True

해결법

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

    1.

    >>> b.test is a.test
    False
    >>> a.test is a.test
    False
    

    방법은 당신이 그들을 찾을 때마다 즉석에서 만들어집니다. 함수 객체 (항상 같은 객체 임)는 기술자 프로토콜을 구현하고 __get__은 바운드 메소드 객체를 생성합니다. 2 개의 바운드 메소드는 일반적으로 같은 객체가 아닙니다.

    >>> id(a.test) == id(b.test)
    True
    >>> a.test is b.test
    False
    

    이 예제는 기만적입니다. 첫 번째 결과는 우연에 의해서만 참입니다. a.test는 바운드 메소드를 작성하고, id (a.test)를 계산 한 후에 가비지 콜렉션을 참조하기 때문에 가비지 수집됩니다. (id는 "생존 기간 동안이 객체에 대해 유일하고 일정한"이라는 문서를 인용한다는 점에 유의하십시오.) b.test는 이전에 가지고 있던 바운드 메소드와 동일한 id를 가지며, 다른 객체는 이제 같은 ID를 갖지 않습니다.

    드물게 id를 사용하는 경우는 거의 없으며 id를 자주 사용하지 않아야합니다. id (foo) == id (bar)는 항상 잘못되었습니다.

    당신의 새로운 예제에 관해서, 당신이 지금하는 일을 잘하면 얻을 수 있습니다 :

    >>> new_improved_test_method = lambda: None
    >>> a.test = new_improved_test_method
    >>> a.test is a.test
    True
    

    이 경우 자동으로 클래스를 바인딩하고 바운드 메소드 객체를 반환하는 클래스의 함수에서 즉석에서 메소드를 작성하지 않습니다. 이 경우 단순히 함수를 인스턴스 속성으로 저장하면됩니다. 조회에서 특별한 것은 발생하지 않습니다 (클래스 속성을 찾을 때 설명자 만 호출 됨). 따라서 속성을 조회 할 때마다 저장 한 원래 객체를 얻을 수 있습니다.

  2. from https://stackoverflow.com/questions/2906177/what-is-the-difference-between-a-is-b-and-ida-idb-in-python by cc-by-sa and MIT license