初学者在条件语句中常常会看到这样的代码:

if value:
    print("有值!")

一开始,这样简单的 if value: 语句 难以搞清楚检查的是什么
尤其是下面这两个:

  • None
  • ""(空字符串)

这两个都被评估为 False,因此感觉 像是相同的东西

那么真的是这样吗?


假值(Falsy)

在 Python 中,以下值在条件语句里被评估为 False:

  • None
  • False
  • 0, 0.0
  • ""(空字符串)
  • [](空列表)
  • {}(空字典)
  • set(), () 等空集合

也就是说,if not value: 是用来捕获这些所有情况的方案。


None"" 是不同的

它们的表现形式不同,功能也不同。

value1 = None
value2 = ""

print(value1 == value2)  # False
print(value1 is value2)  # False

print(bool(value1))  # False
print(bool(value2))  # False
  • == 是值比较,而 is身份(id) 比较。
  • None 是表示 “还没有值”特殊对象
  • ""虽然是字符串,但为空

Empty vs None speech bubble comparison

通过上面的图片可以看到,左边的男性拿着气泡却没有说话——这代表空字符串 ""
右边的女性甚至连气泡都没有——这代表 None

在以下条件中,这两种情况 False

male_voice = ""
female_voice = None

if not male_voice and not female_voice:
    print("两者都没有声音!")  # 两者都是 False,所以执行

那么在实际中我们如何区分呢?

例如,处理用户输入的情况:

username = user_input.get("username", None)
  1. 如果用户没有输入 → None
  2. 如果用户输入了空字符串 → ""

如果想对这两种情况进行不同的处理呢?

if username is None:
    print("完全没有输入!")
elif username == "":
    print("输入了空字符串。")
else:
    print("输入的值:", username)

在实际工作中常见的错误

下面的代码有时会意外地过滤掉所有假值:

if not username:
    print("没有输入")

但是此条件不仅包含空字符串,还包括 None0、空列表等
因此需要明确意图:

  • 即使是空值,只要是字符串就应该允许if username is None:
  • 字符串虽然为空,但必须存在if username != "":
  • 应该完全没有任何值if not username:

总结

None"" 是不同的,但它们都会如同 False 一样表现。
了解这个差异可以让你的代码意图变得 更加清晰,减少错误

在下一篇文章中,我们将深入探讨 0[]{} 等其他假值,以及 is== 的区别!