2013-09-21 1 views
0
>>> l=[(i,j,k) for i in {-4,-2,1,2,5,0} for j in {-4,-2,1,2,5,0} for k in {-4,-2,1,2,5,0} if i+j+k==0 if i==0 & j==0 & k==0] 
>>> l 
[(0, 0, 0), (0, 2, -2), (0, -2, 2)] 

위의 파이썬 3 코드는 i + j + k = 0이고 모든 원소가 0 인 트리플 (i, j, k)을 찾습니다. 따라서 대답은 (0,0,0)이어야합니다.파이썬은 동등성 검사를 어떻게 처리합니까?

그러나 응답이 오기를 하였다 (0, 0, 0), (0, 2, -2), (0, -2, 2)]

I 찾고 약간 문제 있음을 발견하면 and 대신 &을 사용합니다. and은 논리 연산자이고 &은 비트 연산자입니다.

그러나 나는 왜 내가 &을 사용하여 얻은 답을 얻었는지 알 수 없습니다.

파이썬 3은 동등 검사 작업을 어떻게 처리합니까?

+0

평등 검사와 관련이 있는지 이해할 수 없습니다. –

+0

나는 초보자입니다. 제목이 잘못되었다고 생각하면 제목을 편집하십시오. – kryptoknight

답변

1

귀하의 간격

i==0 & j==0 & k==0 

에서 당신을 오해의 소지가있다; ==&보다 낮은 우선 순위를 가지고 있으므로 계산 실제로 0&anything는 0

i == 0&j == 0&k == 0 

때문에이 파이썬 체인 비교 때문에 (예를

i == 0 

와 동일

i == 0 == 0 == 0 

된다 4 < x < 10).

따라서

[(i,j,k) for i in {-4,-2,1,2,5,0} for j in {-4,-2,1,2,5,0} for k in {-4,-2,1,2,5,0} if i+j+k==0 if i==0 & j==0 & k==0] 

모든 (i,j,k) 튜플을 줄 곳 i+j+k = 0i = 0, 그래서 i = 0j = -k.

0

이것을 제거하십시오 : if i==0 & j==0 & k==0.

솔루션

:

>>> l=[(i,j,k) for i in {-4,-2,1,2,5,0} for j in {-4,-2,1,2,5,0} for k in {-4,-2,1,2,5,0} if i+j+k==0 and (i==0 and j==0 and k==0)] 
>>> l 
[(0, 0, 0)] 
+0

마지막으로'and'를 사용하여 그것을했습니다. 그러나 나는 이러한 불일치의 이유에 대해 알고 싶었다. – kryptoknight