IT박스

동일한 ID를 가진 객체는 ==와 비교할 때 항상 동일합니까?

itboxs 2020. 12. 6. 21:20
반응형

동일한 ID를 가진 객체는 ==와 비교할 때 항상 동일합니까?


두 개의 객체 o1과 o2가 있고 우리는

id(o1) == id(o2)

true를 반환 합니다 .

그럼 따라가나요

o1 == o2

아니면 항상 그런 것은 아닙니까? 제가 작업중인 논문에서는 그렇지 않다고 말하지만 제 생각에는 사실이어야합니다!


항상 그런 것은 아닙니다.

>>> nan = float('nan')
>>> nan is nan
True

또는 질문에서와 같은 방식으로 공식화되었습니다.

>>> id(nan) == id(nan)
True

그러나

>>> nan == nan
False

NaN 은 이상한 것입니다. 정의에 따라 그것은 그 자체와 같거나 작거나 크지 않습니다. 그러나 그것은 같은 대상입니다. 이 SO 질문False 에서 모든 비교가 반환 되어야 하는 이유를 자세히 설명 합니다.


종이가 맞습니다. 다음을 고려하세요.

class WeirdEquals:
    def __eq__(self, other):
        return False

w = WeirdEquals()
print("id(w) == id(w)", id(w) == id(w))
print("w == w", w == w)

출력은 다음과 같습니다.

id(w) == id(w) True
w == w False

id(o1) == id(o2)암시하지 않습니다 o1 == o2.

항상 return Troll을 재정의 __eq__하는 이것을 살펴 보겠습니다 False.

>>> class Troll(object):
...     def __eq__(self, other):
...         return False
... 
>>> a = Troll()
>>> b = a
>>> id(a) == id(b)
True
>>> a == b
False

그 존재는이 있어야했다 매우 객체 식별자가 일치하지만 어디 표준 라이브러리의 몇 가지 예를 __eq__반환 할 수 False있는 좋은 예를 찾기위한 MarkMüller @ 명성을 어쨌든.

따라서 객체가 미쳤거나 매우 특별하거나 (nan과 같이) 동시성이 당신을 물었습니다. Foo더 합리적인 __eq__방법 (ID 확인을 '잊음')이 있고 f is f항상 인이 극단적 인 예를 고려하십시오 True.

import threading

class Foo(object):
    def __init__(self):
        self.x = 1

    def __eq__(self, other):
        return isinstance(other, Foo) and self.x == other.x

f = Foo()

class MutateThread(threading.Thread):
    def run(self):
        while True:
            f.x = 2
            f.x = 1

class CheckThread(threading.Thread):
    def run(self):
        i = 1
        while True:
            if not (f == f):
                print 'loop {0}: f != f'.format(i) 
            i += 1

MutateThread().start()
CheckThread().start()

산출:

$ python eqtest.py
loop 520617: f != f
loop 1556675: f != f
loop 1714709: f != f
loop 2436222: f != f
loop 3210760: f != f
loop 3772996: f != f
loop 5610559: f != f
loop 6065230: f != f
loop 6287500: f != f
...

참고 URL : https://stackoverflow.com/questions/34599953/are-objects-with-the-same-id-always-equal-when-comparing-them-with

반응형