Если я сделаю это:
>>> False in [False, True]
True
Это возвращается True
. Просто потому что False
есть в списке.
Но если я сделаю:
>>> not(True) in [False, True]
False
Это возвращается False
. Принимая во внимание, not(True)
что равно False
:
>>> not(True)
False
Почему?
python
python-2.7
python-3.x
Texom512
источник
источник
not(True) in [False, True]
Ответы:
Приоритет операторов 2.x , 3.x . Приоритет
not
ниже, чем уin
. Так что это эквивалентно:Это то, что вы хотите:
Как отмечает @Ben: рекомендуется никогда не писать
not(True)
, предпочитайтеnot True
. Первый делает его похожим на вызов функции, аnot
является оператором, а не функцией.источник
not(True)
; предпочитаютnot True
. Первый делает его похожим на вызов функции, откуда и возникла ваша путаница; если быnot
была функция, тоnot(True) in ...
не могло бы бытьnot ((True) in ...)
. Вы должны знать, что это оператор (или вы попадаете в подобные ситуации), поэтому вы должны писать его как оператор, а не маскировать его как функцию.a + b*c + d
очень плохоa+b * c+d
. Такnot(True)
плохо от этой меры тоже.not True
. НапишитеFalse
вместо.not True
, вы писали бы что-то вродеnot myfunc(x,y,z)
гдеmyfunc
какая-то функция, которая возвращаетTrue
илиFalse
.not x in y
оценивается какx not in y
Вы можете точно увидеть, что происходит, разобрав код. Первый случай работает так, как вы ожидаете:
Во втором случае оценивается
True not in [False, True]
, чтоFalse
явно:Вместо этого вы хотели выразить то
(not(True)) in [False, True]
, что ожидалосьTrue
, и вы можете понять, почему:источник
dis
но это очень ценный ответ, потому что он показывает, что на самом делеnot in
используетсяПриоритет оператора.
in
связывает более плотно, чемnot
, поэтому ваше выражение эквивалентноnot((True) in [False, True])
.источник
Это все о приоритете оператора (
in
сильнее, чемnot
). Но это можно легко исправить, добавив скобки в нужном месте:письмо:
так же, как:
который смотрит,
True
находится ли в списке и возвращает «не» результата.источник
Он оценивается как
not True in [False, True]
, который возвращает,False
потому чтоTrue
находится в[False, True]
Если вы пытаетесь
Вы получите ожидаемый результат.
источник
Наряду с другими ответами, в которых упоминается приоритет
not
нижеin
, фактически ваше утверждение эквивалентно:Но обратите внимание, что если вы не отделяете свое условие от других, python будет использовать 2 роли (
precedence
илиchaining
), чтобы отделить это, и в этом случае python использовал приоритет. Также обратите внимание, что если вы хотите отделить условие, вам нужно поместить все условие в скобки, а не только объект или значение:Но, как уже упоминалось, есть еще одна модификация python для операторов, которая является цепочкой :
На основании документации по питону :
Например, результат следующего утверждения
False
:Потому что python будет связывать операторы следующим образом:
Что именно
False and True
этоFalse
.Вы можете предположить, что центральный объект будет разделен между двумя операциями и другими объектами (в данном случае False).
И обратите внимание, что это также верно для всех сравнений, включая тесты членства и тесты идентичности, которые являются следующими операндами:
Пример :
Другой известный пример - диапазон номеров:
который равен:
источник
Давайте рассмотрим это как операцию проверки содержания коллекции:
[False, True]
это список, содержащий некоторые элементы.Выражение
True in [False, True]
возвращаетсяTrue
, какTrue
элемент содержится в списке.Следовательно,
not True in [False, True]
дает «булево противоположное»,not
результат вышеприведенного выражения (без скобок для сохранения приоритета, посколькуin
имеет больший приоритет, чемnot
оператор). Поэтомуnot True
и приведуFalse
.С другой стороны,
(not True) in [False, True]
равноFalse in [False, True]
, что естьTrue
(False
содержится в списке).источник
Чтобы уточнить некоторые другие ответы, добавление скобок после унарного оператора не меняет его приоритета.
not(True)
не делаетnot
связывать более плотноTrue
. Это просто избыточный набор круглых скобокTrue
. Это так же, как(True) in [True, False]
. Скобки ничего не делают. Если вы хотите, чтобы привязка была более узкой, вы должны поместить круглые скобки вокруг всего выражения, означая как оператор, так и операнд, т.е.(not True) in [True, False]
.Чтобы увидеть это по-другому, рассмотрим
**
связывает более плотно, чем-
, поэтому вы получаете отрицательный квадрат в два, а не квадрат отрицательного два (который был бы положительным четыре).Что если вы хотите получить квадрат отрицательных двух? Очевидно, вы бы добавили скобки:
Тем не менее, не стоит ожидать, что следующее
4
потому
-(2)
что так же, как-2
. Скобки ничего не делают.not(True)
точно так же.источник