Python的秘密生活:Truthiness 与 Falsy Values
Source: Dev.to
对象的本质
Margaret 把茶放下。“Python 没在撒谎,Timothy。它只是非常…哲学。对 Python 来说,if 语句不仅仅是检查变量是否存在,而是检查变量是否具有真值。”
真值? Timothy 问道。“这是技术术语吗?”
“在 Python 中,它绝对是,” Margaret 微笑道。“这个语言里的每个对象都内置了‘真’或‘假’。把 if 语句想象成俱乐部的门卫。他不只是检查你有没有名字,而是检查你是否带了东西来参加派对。如果你空手而来,你就是 Falsy。”
“Falsy” 名人堂
你可以使用 bool() 函数测试任意对象的真值:
bool(0) # False
bool(0.0) # False
bool("") # False
bool([]) # False
bool(()) # False
bool({}) # False
bool(None) # False
如果这些值出现在 if 语句中,它们的行为就像 False。
注意: Falsy 值并不等同于布尔值
False。
0 == False的结果是True,因为它们共享同一个值,但0 is False为False,因为它们是不同的对象。
谎言零
Timothy 试着把分数改成字符串:
score = "0"
if score:
print(f"Current Score: {score}")
else:
print("Welcome! Please play a match to see your score.")
输出
Current Score: 0
非空字符串,即使是 "0",也是 truthy。即使是只包含一个空格的字符串——bool(" ")——也是 truthy。
身份 vs. 实质
如果想在不让“门卫”拒绝的情况下检查分数是否为零,应当检查身份而不是真值:
score = 0
# 不要写 'if score'(真值检查)
# 写 'if score is not None'(身份检查)
if score is not None:
print(f"Current Score: {score}")
else:
print("Welcome! Please play a match.")
输出
Current Score: 0
使用 is not None 是在询问 Python 变量是否指向内存中的实际对象,而不管该对象是 0、False 还是空集合。
Margaret 的速查表:说谎的真相
- 真值检测器:
bool(x)– 查看 Python 如何评估对象的真值。 - 快捷方式(
if x:): 当你只关心集合是否有元素或字符串是否有字符时使用。 - 专业守卫(
if x is not None:): 当0、False或空容器是有效数据且不想被跳过时使用。 - 字符串陷阱:
"0"、"False"和" "都是 truthy,因为它们不是空的。
在下一集,Margaret 和 Timothy 将面对 “复制猫”——Timothy 将了解到,有时复制某物会产生一个仍然缠绕原对象的幽灵。