«Верно» и «Неверно» в Python - PullRequest
       6

«Верно» и «Неверно» в Python

50 голосов
/ 25 февраля 2011

Я попытался запустить этот кусок кода:

path = '/bla/bla/bla'

if path is True:
    print "True"
else:
    print "False"

И это печатает Ложь . Я думал, что Python рассматривает что-либо со значением как True . Почему это происходит?

Ответы [ 3 ]

98 голосов
/ 25 февраля 2011

is сравнивает личность.Строка никогда не будет идентична не-строке.

== равенство.Но строка никогда не будет равна True или False.

. Вы не хотите ни того, ни другого.

path = '/bla/bla/bla'

if path:
    print "True"
else:
    print "False"
64 голосов
/ 25 февраля 2011

С http://docs.python.org/reference/expressions.html#boolean-operations:

В контексте логических операций, а также когда выражения используются в выражениях потока управления, следующие значения интерпретируются как ложные: False, None, numericноль всех типов, и пустые строки и контейнеры (включая строки, кортежи, списки, словари, наборы и фрозенсеты).Все остальные значения интерпретируются как истина.

Ключевое выражение здесь, которое, как мне кажется, вы неправильно понимаете, «интерпретируется как ложное» или «интерпретируется как истинное».Это не означает, что любое из этих значений идентично True или False или даже равно True или False.

Выражение '/bla/bla/bla' будет считаться истинным там, где ожидается логическое выражение (как вif, но выражения '/bla/bla/bla' is True и '/bla/bla/bla' == True будут иметь значение False по причинам, указанным в ответе Игнасио.

3 голосов
/ 15 октября 2018

В то время как другие авторы писали, почему 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")

Источники:

  1. https://medium.com/@dawran6/python-truth-value-testing-is-awesome-dae6c23cc1c2
  2. https://docs.python.org/3.7/library/stdtypes.html#truth-value-testing
...