布尔值 bool
Python 的 bool 类型只有两个值:True 和 False。它继承自 int,在需要数值的上下文中分别表现为 1 和 0,但本质上是独立的逻辑类型。
True 与 False
True 和 False 是内置常量,首字母必须大写:
is_valid = True
is_empty = False
# 小写会报错
# true = 1 # NameError: name 'true' is not defined
bool 是 int 的子类,这带来一些有趣的性质:
print(isinstance(True, int)) # True
print(True + True) # 2
print(True * 10) # 10
print(False * 100) # 0
但 True 和 1 并非同一对象:
print(True == 1) # True,值相等
print(True is 1) # False,身份不同
bool 类型只有 True 和 False 两个实例,因此 is 运算符判断布尔值是安全且推荐的做法。
真值判断
Python 中任何对象都可以被判断为真或假。以下值在布尔上下文中为 False:
NoneFalse- 数值零:
0、0.0、0j - 空序列和空集合:
""、[]、()、{}、set()、range(0)
其余所有对象均为 True:
print(bool(0)) # False
print(bool(0.0)) # False
print(bool("")) # False
print(bool([])) # False
print(bool(1)) # True
print(bool(-1)) # True,非零即真
print(bool(" ")) # True,非空字符串
print(bool([0])) # True,非空列表
注意区分"值为零"和"为空容器":
print(bool(0)) # False
print(bool([0])) # True,列表非空
print(bool("0")) # True,字符串非空
逻辑运算
Python 提供三个逻辑运算符:and、or、not。
not:对操作数进行真值判断后取反,结果一定是 bool:
print(not True) # False
print(not 0) # True
print(not "hello") # False
print(not []) # True
and 和 or:执行短路求值,返回决定结果的操作数本身,不一定是 bool:
# and:第一个为假则返回第一个,否则返回第二个
print(3 and 5) # 5,两者皆真,返回后者
print(0 and 5) # 0,前者为假,短路返回
print("a" and "b") # "b"
print("" and "b") # "",空字符串为假
# or:第一个为真则返回第一个,否则返回第二个
print(3 or 5) # 3,前者为真,短路返回
print(0 or 5) # 5,前者为假,返回后者
print("a" or "b") # "a"
print("" or "b") # "b"
短路求值意味着如果第一个操作数已能决定结果,第二个操作数不会被求值:
def side_effect():
print("被调用了")
return True
print(False and side_effect()) # 不会打印"被调用了"
print(True and side_effect()) # 会打印"被调用了"
常见用法模式
设置默认值:
name = user_input or "匿名"
# 如果 user_input 为空字符串(假),则使用 "匿名"
条件执行:
# 不推荐:与 True 比较是多余的
if is_ready == True:
pass
# 推荐:直接判断
if is_ready:
pass
# 如果需要明确判断布尔值
if is_ready is True:
pass
链式比较:Python 支持数学风格的链式比较:
x = 5
print(1 < x < 10) # True,等价于 1 < x and x < 10
陷阱与边界
== 与 is 的混淆:
# 错误:可能误判
if x == True: # 当 x 为 1 时也为 True
pass
# 正确:严格判断布尔值
if x is True:
pass
# 更常见:判断真值
if x:
pass
布尔值参与算术:虽然合法,但可读性差:
# 不推荐
result = flag * 10
# 推荐
result = 10 if flag else 0
any() 和 all():内置函数简化多对象判断:
print(all([1, 2, 3])) # True
print(all([1, 0, 3])) # False
print(any([0, "", 3])) # True
print(all([])) # True
print(any([])) # False
理解布尔类型和真值判断,是写出简洁 Python 代码的基础。核心原则:用 if x: 判断真值,用 is True 严格判断布尔值,利用短路求值简化逻辑。