2012-02-14 2 views
143

this question에 대한 답을 볼 때, 나는 내 대답을 이해하지 못했다.([1,0] == True의 1)이 False로 평가되는 이유는 무엇입니까?

저는 이것이 어떻게 파싱되는지 이해하지 못합니다. 두 번째 예제가 False를 반환하는 이유는 무엇입니까?

>>> 1 in [1,0]    # This is expected 
True 
>>> 1 in [1,0] == True  # This is strange 
False 
>>> (1 in [1,0]) == True # This is what I wanted it to be 
True 
>>> 1 in ([1,0] == True) # But it's not just a precedence issue! 
          # It did not raise an exception on the second example. 

Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    1 in ([1,0] == True) 
TypeError: argument of type 'bool' is not iterable 

도움 주셔서 감사합니다. 나는 정말로 명백한 무엇인가를 놓쳐 버려야 만한다고 생각한다.


나는이 링크 중복에 미묘하게 다른 생각 :

Why does the expression 0 < 0 == 0 return False in Python?.

두 가지 질문은 표현에 대한 인간의 이해와 관련이 있습니다. 표현을 평가하는 두 가지 방법이 내 마음에 들었다. 물론 올바른 것은 아니지만 나의 예에서는 마지막 해석이 불가능합니다. 0 < 0 == 0 보면

식에서 각 평가되고 절반 만드는 감각을 상상할 수 :이 False 평가하는 이유

>>> (0 < 0) == 0 
True 
>>> 0 < (0 == 0) 
True 

그래서 링크 답변 :

>>> 0 < 0 == 0 
False 

하지만 내 예를 1 in ([1,0] == True) 아무튼와 표현으로 이해할 수 없으므로 가능한 해석이 2 가지 (틀린 것은 틀림)가 아니라 하나만 가능하다.

>>> (1 in [1,0]) == True 
+1

연산자 우선 순위 ...'=='는'in'보다 더 엄격하게 바인딩하므로'[1,0] == True'가 먼저 평가되고 그 결과는 other_result에서'1 '로 지정됩니다. –

+0

파이썬 3.2가 같은 방식으로 동작하기 때문에 파이썬 2.7 태그를 제거했습니다. – lvc

+1

@Marc B : 두 번째 표현 인 –

답변

180

실제로 파이썬은 여기서 비교 연산자 연쇄를 적용합니다. 표현식은

(1 in [1, 0]) and ([1, 0] == True) 

으로 변환되며 이는 분명히 False입니다.

이것은 또한 (2 회 b을 평가하지 않고)

(a < b) and (b < c) 

로 변환하는

a < b < c 

같은 표현식 발생합니다.

자세한 내용은 Python language documentation을 참조하십시오.

+34

이것에 대한 추가적인 증거로, [1, [1, 0] == [1, 0]'은'True'로 평가됩니다. –

+0

'[1,0] == True'에서 1이 아니라 ... – ChessMaster

+8

나는 오랫동안 언어 사마귀로 생각 해왔다. 나는'in' 연산자가 다른 비교 연산자보다 우선 순위가 높고 체인이 아닌 것을 선호했을 것입니다. 하지만 유스 케이스가 누락 된 것 같습니다. –