2016-12-30 2 views
0
var = 86 
print((var<90) & (var>=80)) 

это дает ПравдаPython Битовые операторы '&' Оператор

Но

print(var<90 & var>=80) 
print(var<90 & (var>=80)) 
print((var<90) & var>=80) 
print(var<90 & True) 

`

почему все они дают ложь?

+3

Почему вы пытаетесь использовать побитовый оператор для выполнения булевой операции? –

+0

Попробуйте заменить '&' на 'и'; то, что вы делаете, на самом деле не имеет смысла. – 101

+0

Я знаю, что я должен использовать оператор «и». Я просто хотел знать, почему они давали ложь. @ IgnacioVazquez-Abrams –

ответ

1

Это из-за Operator precedence

Возьмите print(var<90 & True) в качестве примера,

print(var<90 & True) эквивалентно print(var < (90 & True)) и, следовательно, дает значение False.

Однако, если вы положите скобки в нужное место, то есть print((var<90) & True), тогда оно выдаст True.

+0

Какой оператор будет выполнен первым? – dsgdfg

+0

Этот документ не содержит определений 'priority'. Я спрашиваю 'a >> b & c < e dsgdfg

+1

@dsgdfg В документации говорится: «Следующая таблица суммирует приоритеты операторов в Python, начиная с самого низкого приоритета (наименьшая привязка) до наивысшего приоритета (большинство привязок). Операторы в том же поле имеют одинаковый приоритет». –

0

Побитовый оператор & имеет более высокий приоритет, чем операторы сравнения, поэтому сначала оценивается 90 & var, а затем происходит цепное сравнение.

>>> var = 86 
>>> var<90 & var>=80 # var<90, and '90&var' is greater than or equal to 80 
False 
>>> var<(90 & var)>=80 # same as above 
False 
>>> (var<90) & (var>=80) 
True 
3

Вы должны использовать оператор and вместо для логических операций.

Поскольку Python поддерживает цепные операторы отношения (например, вы можете использовать 0 < var < 100 вместо 0 < var and var < 100) и обрабатывают бинарные операции (т.е. сложение, вычитание, битовые операции и т.д.) перед реляционных операторов из-за приоритет операторов, все неисправного дела, которые вы опубликовали, фактически означают что-то другое.

  1. var < 90 & var >= 80 эквивалентно (var < 90 & var) and (90 & var >= 80)
  2. var < 90 & (var>=80) эквивалентно var < 90 & True, на которые смотрят на 4-ом случае.
  3. (var<90) & var>=80 также похож на 4-й корпус (это разрешает True & var >= 80, который затем разрешает 0 >= 80).
  4. var < 90 & True эквивалентен var < (90 & True). Реализация оператора & предназначена для возврата 0, если один из операндов не является целым числом (что является еще одним из самых больших ошибок динамической типизации), поэтому все подобные подобные утверждения разрешают var < 0, что является ложным.
Смежные вопросы