【发布时间】:2011-07-04 10:22:04
【问题描述】:
我尝试运行这段代码:
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。为什么会这样?
【问题讨论】:
虽然其他发帖人解释了为什么 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")
来源:
【讨论】:
在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为假:假、无、所有类型的数字零以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集合)。所有其他值都被解释为 true。
我认为您误解的关键短语是“解释为假”或“解释为真”。这并不意味着这些值中的任何一个都等于 True 或 False,甚至等于 True 或 False。
表达式 '/bla/bla/bla' 将在需要布尔表达式的情况下被视为 true(如在 if 语句中),但表达式 '/bla/bla/bla' is True 和 '/bla/bla/bla' == True 将评估为 False,原因在 Ignacio 的回答中。
【讨论】:
bool 函数将值“解释”为布尔值会有所帮助。你可以说这个函数在每个 if 中被隐式调用(这在技术意义上可能不是真的,但至少添加它不会改变 if 语句的行为)。
is 比较身份。字符串永远不会与非字符串相同。
== 是平等的。但是字符串永远不会等于True 或False。
你都不想要。
path = '/bla/bla/bla'
if path:
print "True"
else:
print "False"
【讨论】: