2013-09-21 3 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)] 

Вышеупомянутый код Python 3 находит тройки (i, j, k) такие, что i + j + k = 0 и все элементы равны 0. Поэтому ответ должен быть (0,0,0).Как Python обрабатывает проверку равенства?

Но ответ пришел был [(0, 0, 0), (0, 2, -2), (0, -2, 2)]

После недолгих поисков я обнаружил, что проблема заключается в использовании & вместо and. Я понимаю, что and является логическим оператором, а & является побитовым оператором.

Но я не могу понять, почему я получил ответы, полученные с помощью &.

Как Python3 управляет проверкой на равенство?

+0

Я не понимаю, что это связано с проверкой равенства. –

+0

Я новичок здесь. Поэтому, пожалуйста, отредактируйте название, если вы считаете, что это неправильно. – kryptoknight

ответ

1

Ваш шаг в

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

вводит в заблуждение вас; == имеет более низкий приоритет, чем & поэтому расчет на самом деле

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

Поскольку 0&anything является 0, это становится

i == 0 == 0 == 0 

, которая является такой же, как

i == 0 

потому, что Python цепи сравнений (например как 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 = 0 и i = 0, поэтому там, где i = 0 и j = -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

Смежные вопросы