Я попытался запустить этот фрагмент кода:
path = '/bla/bla/bla'
if path is True:
print "True"
else:
print "False"
И он печатает False. Я думал, что Python рассматривает что-либо со значением True. Почему это происходит?
Я попытался запустить этот фрагмент кода:
path = '/bla/bla/bla'
if path is True:
print "True"
else:
print "False"
И он печатает False. Я думал, что Python рассматривает что-либо со значением True. Почему это происходит?
В контексте логических операций, а также когда выражения используются в выражениях потока управления, следующие значения интерпретируются как ложные: False, None, числовой ноль всех типов и пустые строки и контейнеры (включая строки, кортежи, списки, словари, наборы и морозенцы). Все остальные значения интерпретируются как истина.
Ключевое выражение здесь, которое, я думаю, вы неправильно понимаете, "интерпретируется как ложное" или "интерпретируется как истинное". Это не означает, что любое из этих значений идентично True или False или даже равно True или False.
Выражение '/bla/bla/bla'
будет считаться истинным, если ожидается логическое выражение (как в выражении if
), но выражения '/bla/bla/bla' is True
и '/bla/bla/bla' == True
будут иметь значение False по причинам, указанным в ответе Игнасио.
is
сравнивает идентификатор. Строка никогда не будет идентична не-строке.
==
- равенство. Но строка никогда не будет равна либо True
, либо False
.
Вы ничего не хотите.
path = '/bla/bla/bla'
if path:
print "True"
else:
print "False"
В то время как другие постеры рассказывали, почему is True
делает то, что он делает, я хотел ответить на эту часть вашего сообщения:
Я думал, что Python рассматривает что-либо со значением как True. Почему это происходит?
Исходя из Java, меня это тоже смутило. Python не обрабатывает что-либо со значением как True
. Свидетель:
if 0:
print("Won't get here")
Это ничего не напечатает, потому что 0 рассматривается как False
. Фактически, ноль любого числового типа оценивается как False
. Они также заставили decimal
работать так, как вы ожидаете:
from decimal import *
from fractions import *
if 0 or 0.0 or 0j or Decimal(0) or Fraction(0, 1):
print("Won't get here")
Вот другое значение, которое оценивается как False
:
if None or False or '' or () or [] or {} or set() or range(0):
print("Won't get here")
Источники: