Python中True和False的判断陷阱:逻辑取反与条件语句详解

今天早睡
今天早睡
发布时间:2026-10-15| 2人浏览过
原创

本文详解Python中True和False的使用陷阱,重点区分逻辑取反not与按位取反~的差异。解析if条件语句中非零值自动转为True的机制,以及pandas DataFrame.loc中布尔索引与Series取反行为的特殊性,帮助开发者避免常见错误。

前言

在Python编程中,True和False的使用常令初学者困惑,稍有不慎便易引发错误。本文梳理了三个高频易错场景:逻辑取反操作、if条件判断以及pandas.DataFrame.loc切片中的条件表达式。

1. True和False的逻辑取反

处理True和False的逻辑取反时,应选用not运算符,而非~。

原因在于Python中not执行逻辑取反,而~执行按位取反。True和False在数值上分别对应1和0,因此~True等同于对1进行按位取反,结果为-2,而not True的结果才是False。

print(True)
print(~True)
print(not True)

运行结果如下:

True -2 False

同理,~False的结果为1,而not False的结果才是True。

print(False)
print(~False)
print(not False)

运行结果如下:

False -1 True

注:Python中~按位取反基于数的补码进行,具体过程为:

1 => 补码00000001 => ~按位取反 => 补码11111110 => 2

双重否定的结果表现如下:

print(not not True)
print(~~True)
print(not ~True)
print(~(not True))

运行结果如下:

True 1 False -1

对False进行双重否定:

print(not not False)
print(~~False)
print(not ~False)
print(~(not False))

运行结果如下:

False 0 False -2

2. if条件语句中的True和False

在Python中,if语句后的条件若为非0和非空(null)值,均被视为True;若为0或null,则被视为False。这一特性与其他编程语言存在差异,多语言开发者容易混淆。因此,即使判断条件为负数,Python也会将其视为True处理,不会执行else分支。示例如下:

if (-2):
    print('a')
else:
    print('b')

输出结果为:a

若在条件中使用~对True或False进行取反,则无法得到预期结果:

if (~True): # ~True == -2
    print('a')
else:
    print('b')

输出结果为:a

只有使用not进行取反,才能实现逻辑取反的效果:

if not True:
    print('a')
else:
    print('b')

输出结果为:b

3. pandas.DataFrame.loc中的否定

pandas.DataFrame.loc官方文档指出: Access a group of rows and columns by label(s) or a boolean array. 即可以通过布尔列表作为输入,其中包括使用条件表达式返回布尔列表,例如:

首先创建一个DataFrame对象:

import pandas as pd
 
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
    index=['cobra', 'viper', 'sidewinder'],
    columns=['max_speed', 'shield'])
 
df

使用条件表达式筛选出shield列大于6的数据:

df.loc[df['shield'] > 6]

若要筛选出shield列小于等于6的数据,可以使用:

df.loc[df['shield'] <= 6]

或者使用:

~ df.loc[~(df['shield'] > 6)]

另一个示例,筛选出index中不包含'er'两个字母的数据:

df.loc[~df.index.str.contains('er')]

需要注意的是,在此处使用df.index.str.contains('er')作为筛选条件时,返回的是pd.Series对象。

在pd.Series中,~操作符已被重载,其对布尔类型数据执行逻辑取反,对数值类型数据执行按位取反。

df.index.str.contains('er')

运行结果如下:

array([False, True, True])

对布尔类型的pd.Series使用~进行取反,执行的是逻辑取反。

~pd.Series([False, True, False])

运行结果如下:

True False True dtype: bool

若对数值型的pd.Series使用~进行取反,则执行的是按位取反。

~pd.Series([1,2,3])

运行结果如下:

-2 -3 -4 dtype: int64

总结

至此,关于Python中True(真)和False(假)判断的文章介绍完毕。如需了解更多Python True和False的详细内容,请搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。