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

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)

实践中常见的错误

以下代码有时会不小心过滤掉所有 Falsy 值:

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

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

  • 即使是空值也应该允许字符串if username is None:
  • 字符串可以为空,但必须存在if username != "":
  • 必须什么值都没有if not username:

总结一下

None"" 是不同的。但两者都表现为 False
了解这个区别可以使你的代码意图 更加清晰且无错误

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