주문

2013-10-22 5 views
5

난 그냥 발생 논리 값의 동등성을 테스트 할 때 다음과 파이썬의 행동에 대해 궁금 : 특히주문

>>> x = 1 
>>> x in range(2) 
True 
>>> type(x in range(2)) 
<type 'bool'> 
>>> x in range(2) == True 
False 
>>> x in range(2) == False 
False 
>>> (x in range(2)) == True 
True 

, 왜 (1 in range(2)) == TrueTrue 평가하고 l in range(2) == TrueFalse로 평가합니까? 당신은 순서가 명시 적으로 잘못 할 경우, 당신은 TypeError 얻을 것을 제외하고, 후자의 평가 행동의 이상한 순서가있는 것 같습니다 : 기록을 위해

>>> x in (range(2) == True) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: argument of type 'bool' is not iterable 

을 나는 어떤 경우를 모르는, 어디 단지 x in range (2) 대신 x in range(2) == True을 사용 하겠지만, 왜 이런 일이 일어나고 있는지 알고 싶을 것입니다. 또한 Python2.7과 Python3 모두에서 이것을 테스트했으며 동작은 같습니다.

답변

4

아래 표현 :

x in range(2) == True 

비교를 체인, 그리고로 평가된다 False로 평가된다 당신에게 range(2) == TrueFalse을 줄 것이다

x in range(2) and range(2) == True 

. Comparison에 대한 설명서를 참조하십시오 :

비교는 y를 한 번만 평가된다 (그러나 허위로 판명 된 경우 x < y 두 경우에 z는 전혀 평가되지 않습니다 제외하고는 예를 들어, x < y <= z는, x < y and y <= z에 해당 임의로 체인 될 수있다).

+0

좋은 통찰력! 웬일인지 다른 통신 수와 연계 될 수 있다고는 생각하지 못했습니다. – mdml

3

== 평등과 in 회원 연산자는 모두 comparison operators 있으며, 이러한 을 체인 방식으로 연결할 수 있습니다.

체이닝은 expr1 op1 expr2 op2 expr3의 형식을 취하며 (expr1 op1 expr2) and (expr2 op2 expr3)으로 해석되지만 가운데는 expr2으로 한 번만 평가됩니다.

그래서, 당신의 예는 정말 :

x in range(2) and range(2) == True 

range(2) 부울 값과 동일한 결코 없다.

실제로는 == True 또는 == False과 비교해서는 안됩니다. 0보다 낮게 설정하려면 while 또는 if으로 두어에 대해 을 테스트하십시오.

-1

나는 실제로 당신이 이것을 얻으려는 사람이 range(2) 부분만을 평가하고 있다고 생각한다.

>>> range(2) == True 
>>> False