2014-10-09 4 views
1

진정한 연산자 목록의 회원을 비교

for e in a: print e in a 

인쇄

True 
True 

,의 우리가 인터프리터 그런

a = [1, 2] 

있다고 가정 해 봅시다하지만 다음 코드는하지 않습니다 나 또는 내 파이썬 - 전문가 친구의 감각

for e in a: print e in a == True 

인쇄

False 
False 

누군가가이 설명 할 수 있습니까? 우리가 아래로 혼란 식을 끓여 경우

답변

1

, 그것은이다

1 in a == True 

이것은 False (우리는 True를 예상했을 수도) 제공합니다. 그래서 그것을 검사 할 ast 모듈을 사용하자 :

>>> print ast.dump(ast.parse('(1 in a) == True')) 
Module(body=[ 
    Expr(value=Compare(
     left=Compare(
     left=Num(n=1), 
     ops=[In()], 
     comparators=[ 
      Name(id='a', ctx=Load()) 
     ]), 
     ops=[Eq()], 
     comparators=[ 
     Name(id='True', ctx=Load()) 
     ])) 
    ]) 

당신이 차이를 볼 마십시오

>>> import ast 
>>> print ast.dump(ast.parse('1 in a == True')) 
Module(body=[ 
    Expr(value=Compare(
     left=Num(n=1), 
     ops=[In(), Eq()], 
     comparators=[ 
     Name(id='a', ctx=Load()), 
     Name(id='True', ctx=Load()) 
     ])) 
    ]) 

당신은 아마 기대하는 방식으로 작동 추가 괄호가있는 버전과 비교? 두 번째 것은 Eq(In(1, a), True)과 같습니다. 하지만 첫 번째는 In(1, a) Eq(a, True)입니다. 뭐? 이 두 가지가 어떻게 함께 움직이는가? 글쎄, 그들은 and처럼 접속사를 형성합니다.

그래서 첫 번째 표현식은 1 in a and a == True과 같습니다.

하지만 왜? 이 같은

파이썬이 지원 때문입니다 "체인 조건문,"

1 < 3 < 5 

귀하의 예는 단지 부수적 인 피해입니다 : 분명히뿐만 아니라 체인 < 같은 조건문하지만 in 카운트도 있습니다. 이것은 나에게 직관적이지 않지만, 그것이 작동하는 방법입니다. 여기서 체인에 대해 더 자세히 읽을 수 있습니다 : https://docs.python.org/2/reference/expressions.html#not-in

+1

'In (1, a) Eq (a, True)'를 처음으로 비교하는 것은 아닙니까? 그렇지 않으면'1 == True'가'True'이지만'a == True'가'False'이므로,'True'를 반환 할 것입니다, 맞습니까? –

+1

@Neftas : 정확합니다. 그것은 내 대답에 단순한 오타였습니다. 이제 해결되었습니다. 고맙습니다. –