반응형
동일한 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
...
반응형
'IT박스' 카테고리의 다른 글
C ++ 전 처리기 : 멤버 변수 목록의 코드 반복 방지 (0) | 2020.12.06 |
---|---|
EditText에서 텍스트가 변경된 후 0.5 초 후에 어떻게해야합니까? (0) | 2020.12.06 |
Android에서 인터넷 연결을 어떻게 확인합니까? (0) | 2020.12.06 |
.gitignore는 디렉토리를 무시하지 않습니다. (0) | 2020.12.06 |
WordPress : 사용자 지정 게시물 유형에서 "새로 추가"비활성화 (0) | 2020.12.06 |