NaN은 목록 또는 세트에서 해당 존재를 확인하면 완벽하게 처리됩니다. 그러나 나는 어떻게 이해하지 못한다. [업데이트 : 아니 아니에요; NaN의 동일한 인스턴스가 발견되면 (자) 현재로서보고됩니다. NaN이의 동일하지 않은 경우가 발견되면, 컨테이너에 NaN 존재 여부 확인
- 내가 평등에 따라 시험 할 때,리스트의 존재를 생각]. 결석으로보고, 그래서 나는 NaN이가 NaN 이후 찾을 수 없습니다 것으로 예상! = NaN가.
해시 (NaN)와 해시 (0)는 모두 0입니다. 사전과 집합이 NaN과 0을 어떻게 구별합니까?
in
연산자를 사용하여 임의의 컨테이너에서 NaN 존재를 확인하는 것이 안전합니까? 아니면 구현에 의존 하는가?
내 질문에 대한 파이썬 3.2.1; 그러나 향후 버전에 기존/계획된 변경 사항이있는 경우이를 알고 싶습니다. 적어도 CPython의에 - 나는 list
에 사용자 정의 클래스의 인스턴스를 추가 한 다음 봉쇄를 확인하는 경우 (정의 된 경우), 인스턴스의 __eq__
메서드가 호출되는 것을
NaN = float('nan')
print(NaN != NaN) # True
print(NaN == NaN) # False
list_ = (1, 2, NaN)
print(NaN in list_) # True; works fine but how?
set_ = {1, 2, NaN}
print(NaN in set_) # True; hash(NaN) is some fixed integer, so no surprise here
print(hash(0)) # 0
print(hash(NaN)) # 0
set_ = {1, 2, 0}
print(NaN in set_) # False; works fine, but how?
참고. 그래서 list
봉쇄가 ==
연산자를 사용하여 테스트되었다고 가정합니다.
편집 :
당 로마의 대답은, 그것은 list
는, 아주 이상한 방법으로 tuple
, set
, dict
동작합니다이 __contains__
위한 것으로 보인다 : I didn를하기 때문에
def __contains__(self, x):
for element in self:
if x is element:
return True
if x == element:
return True
return False
내가 '이상한'말 ' 설명서에 설명 된 내용 (어쩌면 내가 놓친 것)이 보이고 이것이 구현 선택으로 남겨서는 안되는 것입니다.
물론 하나의 NaN 객체는 다른 NaN 객체와 동일하지 않을 수도 있습니다 (id
의미). (사실 놀랍지는 않지만 파이썬은 그러한 신원을 보증하지 않습니다. 사실 CPython은 작은 수 또는 짧은 문자열의 인스턴스를 공유하지만 다른 장소에서 생성 된 NaN의 인스턴스를 공유하지 못했습니다.) 내장 컨테이너에 NaN이 있는지 테스트하는 것은 정의되지 않습니다.
이것은 매우 위험하고 매우 미묘합니다. 위의 코드를 실행하면 in
을 사용하여 NaN 멤버십을 테스트하는 것이 안전하다고 잘못 결론 지을 수 있습니다.
나는이 문제에 대한 완벽한 해결 방법이 없다고 생각합니다. 하나의 매우 안전한 접근 방법은 NaN이 내장 컨테이너에 추가되지 않도록하는 것입니다. (코드 전체에서 확인하는 것이 고통 스럽습니다 ...)
in
의 왼쪽에 NaN이있을 수 있으므로 다른 방법으로는 math.isnan()
을 사용하여 NaN 멤버십을 별도로 테스트하십시오. . 또한, 다른 작업 (예 : 교차 설정)도 피해야하거나 다시 작성해야합니다.
Bottonline : 안전한쪽에 사용 : any (목록의 요소에 대한 math.isnan (요소)) – jsbueno
@jsbueno : 예 ...하지만 교차로 문제는 도움이되지 않습니다. 'cont1에서 x에 대해 : cont2에서 x가 뭔가를하면'의 경우도 처리하지 않습니다 ... 결론은 "매우 두려워하고, 당신이 뭔가를 간과하지 않기를 바랄 것"이라고 말하고 싶습니다. – max
그것은 ' 도움을 청하십시오. 쉬운 해결책이 없다는 것에 동의해야합니다. 위의 루프를 사용하여 임의의 NaN을 "NaN"문자열로 변환 할 수 있습니다. 이는 비교할 수 없을 정도로 비교할 것입니다. – jsbueno