Побитовый оператор & в цепочечном сравнении

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

печать True,

Но зачем все это печатать False?

print(var < 90 & var >= 80)
print(var < 90 & (var >= 80))
print((var < 90) & var >= 80)
print(var < 90 & 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 что неверно

Это из-за приоритета оператора

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

print( var<90 & True) эквивалентно print( var < (90 & True)) и следовательно это дает Ложь.

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

Побитовый оператор & имеет более высокий приоритет, чем операторы сравнения, поэтому 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
Другие вопросы по тегам