В таких языках, как C, нет логического типа или значений; вместо них используются целые числа. Ноль - это ложь, все остальные целые числа - истина.
Python обобщает это на все значения. Действительно, существует логический тип, но он является подклассом int
, а True
и False
- это буквально значения 1
и 0
соответственно. Любое значение может быть преобразовано в логическое значение, вызвав для него bool
.
>>> bool(5)
True
>>> bool(0)
False
>>> bool("foo"), bool([1,2,3])
True, True
>>> bool(""), bool([])
False, False
«Истинность» значения зависит от его типа, но грубо говоря, нули и значения, подобные пустым контейнерам, имеют значение False, а все остальные значения - True. Кроме того, and
и or
не обязательно возвращают логическое значение:
x and y == y if bool(x) else x
x or y == x if bool(x) else y
bool
используется, чтобы определить, истинно ли x
или нет, но результат является одним из два фактических значения x
или y
.
Используя эквивалент для and
, мы можем оценить ваше выражение как
c and b<0 and a>0 == (b < 0 if bool(c) else c) and a > 0
== b < 0 if bool(2) else c) and a > 0
== (b < 0 if True else c) and a > 0
== b < 0 and a > 0
== a > 0 if bool(b < 0) else b < 0
== a > 0 if bool(-1 < 0) else b < 0
== a > 0 if bool(True) else b < 0
== a > 0 if True else b < 0
== a > 0
== 5 > 0
== True
Я не подставлял значения для a
, b
и c
одновременно, потому что and
, or
и условное выражение - все lazy ; они не оценивают операнд, если это не является абсолютно необходимым, как мы вскоре увидим.
Если вы измените c = 0
, в процессе оценки будет получено значение c
, а не логическое значение c
. Обратите внимание, что нам нужно посмотреть на значение a
, потому что a > 0
никогда не вычисляется.
c and b<0 and a>0 == (b < 0 if bool(c) else c) and a > 0
== (b < 0 if bool(0) else c) and a > 0
== (b < 0 if False else c) and a > 0
== c and a > 0
== a > 0 if bool(c) else c
== a > 0 if bool(0) else c
== a > 0 if False else c
== c
== 0