当前位置: 首页 > article >正文

Python 3.12 Key Words - 02 - True、 False、 None

Python 3.12 Key Words -True、False、None在 Python 的 35 个硬关键字中True、False和None属于内置常量。它们不是普通的变量而是语言本身定义的单例对象分别代表布尔真、布尔假和“空值”。理解这三个常量是掌握 Python 逻辑判断、条件控制、函数返回值以及对象生命周期的基石。本文将从语法、用法、底层实现、常见陷阱及最佳实践等方面以大量示例和逐行解析带你彻底吃透这三个关键字。一、概述常量 vs 关键字True、False、None在 Python 中既是关键字保留字也是内置常量。与if、for等控制流关键字不同它们代表具体的对象。你无法对它们赋值会引发SyntaxError因为它们是语言硬编码的。True和False是bool类型的仅有两个实例。None是NoneType类型的唯一实例。这些常量在 Python 启动时被创建并一直存在直到解释器退出。二、True与False布尔世界的两极2.1 定义与类型True和False是布尔对象用于表示逻辑真和假。在 Python 中bool是int的子类因此True等价于1False等价于0。这一设计保证了与旧代码早期 Python 用整数 0/1 表示布尔值的兼容性。type(True)classboolisinstance(True,int)TrueTrue1TrueFalse0TrueTrueTrue# 算术运算中当作 112为什么bool是int的子类在 Python 2.2 之前没有独立的布尔类型直接用整数 0/1 表示真假。引入bool时为了不破坏现有代码例如依赖True 1的代码将bool设计为int的子类。这样True和False可以参与算术运算但同时也带来了一个微妙问题True is 1为False因为它们是不同对象而True 1为True。2.2 布尔上下文与真值测试在条件表达式如if、while、and/or操作符中任何 Python 对象都可以被隐式转换为布尔值称为“真值测试”。转换规则如下以下情况被视为False布尔False本身None数字零0,0.0,0j空序列/集合,[],(),{},set(),range(0)自定义类中如果实现了__bool__()且返回False或者未实现__bool__但实现了__len__()且返回0则视为假。其他所有值都被视为True。# 示例各种对象的布尔值print(bool(0))# Falseprint(bool(1))# Trueprint(bool([]))# Falseprint(bool([1,2]))# Trueprint(bool())# Falseprint(bool(hello))# Trueprint(bool(None))# False为什么这样设计这种隐式转换使得代码非常简洁例如if items:可以直接判断列表是否为空而不必if len(items) 0:。2.3 逻辑运算符的短路行为Python 中的逻辑运算符and、or、not基于布尔值工作但它们的返回值不一定是布尔值而是操作数本身。这种设计称为短路求值。x and y如果x为假返回x否则返回y。x or y如果x为真返回x否则返回y。not x总是返回布尔值True或False。# 短路 or返回第一个真值nameinput(Enter name: )orAnonymousprint(fHello,{name})# 短路 and如果第一个为假则直接返回不计算第二个defsafe_divide(a,b):returnb!0anda/b# 若 b0 则返回 False不会触发 ZeroDivisionErrorresultsafe_divide(10,0)print(result)# False逐行解析input()可能返回空字符串假值此时or返回Anonymous。safe_divide中b ! 0为False因此and直接返回False不会计算a / b避免了异常。为什么这样写这种模式常用于设置默认值、避免异常、链式条件等使代码更紧凑。2.4vsis的区别比较值是否相等。is比较对象身份内存地址是否相同。由于True和1值相等但对象不同所以True 1为TrueTrue is 1为False。aTrueb1print(ab)# Trueprint(aisb)# False最佳实践判断布尔常量时直接使用if x:或if not x:不需要显式比较True/False。仅当需要区分None、0、False时才使用is。# 推荐写法ifx:# 隐式真值测试...# 不推荐冗余ifxisTrue:...2.5 底层实现CPython 中的bool对象在 CPython 源码中True和False是全局单例对象定义在Objects/boolobject.c中。它们分别是PyBool_Type的两个实例/* 简化的源码结构 */PyObject _Py_FalseStruct{_PyObject_HEAD_INIT(PyBool_Type)0};PyObject _Py_TrueStruct{_PyObject_HEAD_INIT(PyBool_Type)1};_Py_TrueStruct和_Py_FalseStruct是静态分配的PyObject实例。它们的类型都是PyBool_Type该类型定义了bool的行为如__repr__返回True/False算术运算时转换为整数等。由于是单例所有对True的引用都指向同一个对象因此True is True永远为True。三、None虚无的化身3.1 定义与用途None是NoneType类型的唯一实例表示“没有值”、“空”或“缺失”。它通常用于函数没有显式return时默认返回None。作为可选参数的默认值表示参数未被提供。作为哨兵值表示某种特殊状态如“未找到”。deffunc():passprint(func())# Nonedeffind(lst,target):fori,vinenumerate(lst):ifvtarget:returnireturnNone# 明确返回 None 表示未找到3.2None的比较永远使用is由于None是单例对象推荐使用is或is not进行比较而不是。原因有二效率is直接比较指针比快可能触发__eq__方法。正确性某些对象可能重写__eq__导致obj None返回意外结果而obj is None不受影响。xNoneifxisNone:# 正确print(x is None)ifxNone:# 不推荐但也能工作因为 None 的 __eq__ 实现正确print(same)注意在 Python 中None的__eq__方法被实现为只与自身比较返回True与其他任何对象比较返回False。因此x None实际上也能正确工作但官方文档和 PEP 8 都建议使用is。3.3 经典陷阱可变默认参数这是 Python 新手最容易犯的错误之一使用可变对象作为函数默认参数。# 错误示例defappend_to_list(value,target[]):target.append(value)returntargetprint(append_to_list(1))# [1]print(append_to_list(2))# [1, 2] ← 意外默认列表被共享了原因默认参数在函数定义时被创建并且只创建一次之后每次调用如果不提供该参数都会使用同一个列表对象。正确做法使用None作为哨兵在函数体内创建新列表。defappend_to_list(value,targetNone):iftargetisNone:target[]target.append(value)returntargetprint(append_to_list(1))# [1]print(append_to_list(2))# [2]逐行解析参数target默认值为None。在函数内部判断if target is None如果是则创建一个新的空列表。这样就保证了每次调用未提供target时都会得到一个全新的列表。为什么这样写这是 Python 中处理可变默认参数的标准模式避免了意外的状态共享。3.4 底层实现Py_None单例在 CPython 源码中None是一个全局单例对象定义在Objects/object.cPyObject _Py_NoneStruct{_PyObject_HEAD_INIT(PyNone_Type)};_Py_NoneStruct是静态分配的PyObject实例。它的类型是PyNone_Type该类型定义了None的行为如__repr__返回None。所有对None的引用都指向这个对象因此None is None永远为True。四、综合示例与逐行解析示例 1布尔运算与短路求值# 定义两个变量a10b0# and 运算result_andaandb# a 为真所以返回 bprint(result_and)# 输出 0# or 运算result_oraorb# a 为真短路返回 aprint(result_or)# 输出 10# not 运算print(nota)# Falseprint(notb)# True逐行解析a and b由于a非零真and返回第二个操作数b即0。a or b由于a为真or短路返回第一个真值a即10。not aa为真取反得False。not bb为假0取反得True。应用场景设置默认值、条件链等。示例 2使用None作为哨兵值deffind_first(seq,predicate):返回 seq 中第一个满足 predicate 的元素若没有则返回 Noneforiteminseq:ifpredicate(item):returnitemreturnNonenumbers[1,3,5,7,9]resultfind_first(numbers,lambdax:x5)ifresultisnotNone:print(fFound:{result})else:print(Not found)逐行解析函数find_first遍历seq当predicate(item)为真时返回该元素。如果遍历完都没找到返回None。调用方使用result is not None判断是否找到。注意不能简单用if result因为当找到的元素本身为0、False或空序列时if result也会为假导致误判。为什么这样写None作为哨兵值能够明确区分“未找到”和“找到了一个假值元素”。示例 3布尔值参与算术理解但不推荐count0foriinrange(10):count(i%20)# 偶数条件为 True加 1奇数加 0print(count)# 输出 5逐行解析(i % 2 0)返回布尔值但布尔值可被当作整数1或0使用。因此count累加了偶数的个数结果为 5。为什么这样写利用了True/False与1/0的等价性代码简洁但可读性较差。建议显式写if i % 2 0: count 1。示例 4None与可变默认参数的正确用法classProcessor:def__init__(self,optionsNone):ifoptionsisNone:options{}self.optionsoptions self.data[]p1Processor()p2Processor()p1.options[key]valueprint(p2.options)# {}互不影响逐行解析__init__中options默认值为None。如果调用时未提供options则在方法内创建一个新的空字典。这样每个实例都有自己的options字典不会相互干扰。为什么这样写避免了options{}作为默认参数导致所有实例共享同一个字典的陷阱。五、常见误区与注意事项5.1 不要直接比较布尔值# 不推荐ifxTrue:...# 推荐ifx:...5.2 不要用is比较数值或字符串# 错误依赖小整数缓存-5 到 256a1000b1000print(aisb)# True 可能是 False取决于 1000 在不在缓存范围内# 正确用 print(ab)# True5.3None不是空字符串、0 或空列表ifnotx:# 当 x 是 None、0、空字符串等时都成立passifxisNone:# 仅当 x 是 None 时成立pass5.4 不要修改True、False、None实际上不能TrueFalse# SyntaxError: cannot assign to TrueNone0# SyntaxError: cannot assign to None六、总结关键字类型单例用途推荐比较方式Truebool是表示真直接用于条件Falsebool是表示假直接用于条件NoneNoneType是表示空值、缺失is None/is not NoneTrue、False、None是 Python 中不可变且唯一的常量使用is比较None是最佳实践而布尔常量直接用于条件表达式。理解它们在底层作为单例对象的实现有助于写出高效且正确的代码。掌握可变默认参数的None哨兵模式可以避免难以追踪的 bug。利用布尔值的短路求值特性可以简化代码但要注意可读性。掌握这三个关键字是迈向 Python 高级编程的第一步。下一篇我们将继续解析逻辑与成员运算符and、or、not、in、is。希望本文能帮助你打下坚实的基础。如果在学习过程中遇到问题欢迎在评论区留言讨论!

相关文章:

Python 3.12 Key Words - 02 - True、 False、 None

Python 3.12 Key Words - True、 False、 None在 Python 的 35 个硬关键字中,True、False 和 None 属于内置常量。它们不是普通的变量,而是语言本身定义的单例对象,分别代表布尔真、布尔假和“空值”。理解这三个常量是掌握 Python 逻辑判…...

红外遥控模块实战:从解码到智能控制全解析

1. 红外遥控模块基础认知 第一次接触红外遥控模块时,我盯着桌上那个黑色的小方块研究了半天——它看起来就像个普通电子元件,却能隔空控制空调电视。这种神奇的能力其实源于红外光的特性:波长介于可见光和微波之间(通常850-1100nm…...

【SITS2026独家授权】:AGI金融预测模型训练全链路手册(含QuantConnect适配代码、FedAvg联邦微调脚本、SEC/FCA双合规审计checklist)

第一章:SITS2026独家授权声明与AGI金融预测范式演进 2026奇点智能技术大会(https://ml-summit.org) SITS2026(Singularity Intelligence & Trading Systems 2026)是由全球AGI金融研究联盟(GAFRA)与国际机器学习峰…...

告别单调显示!用LinkBoy和GD32玩转240*240彩屏:动画、绘图与性能优化实战

告别单调显示!用LinkBoy和GD32玩转240*240彩屏:动画、绘图与性能优化实战 在嵌入式开发领域,显示效果往往决定了用户体验的上限。一块240*240的彩色屏幕,配合GD32这类高性能低成本单片机,能创造出远超传统单色屏的视觉…...

别再死记硬背了!用Python快速搞定离散数学命题逻辑的真值表与范式

用Python自动化离散数学:真值表与范式的实战指南 离散数学中命题逻辑的真值表与范式计算,常常让计算机专业的学生陷入重复机械运算的泥潭。当命题变元超过3个时,手工计算不仅耗时耗力,还容易出错。其实,这正是编程大显…...

从实验室到生产环境:我的GitLab CE 10.5.2避坑升级与配置调优笔记

从实验室到生产环境:GitLab CE 10.5.2深度调优与高可用实践 当团队规模从三五人扩展到二十人以上时,实验室里那台4GB内存的GitLab服务器开始频繁出现502错误。页面加载时间从秒级变成分钟级,CI/CD流水线排队时间甚至超过实际构建时间——这正…...

如何快速上手Azure Kinect Sensor SDK:面向开发者的完整深度相机开发工具包教程

如何快速上手Azure Kinect Sensor SDK:面向开发者的完整深度相机开发工具包教程 【免费下载链接】Azure-Kinect-Sensor-SDK A cross platform (Linux and Windows) user mode SDK to read data from your Azure Kinect device. 项目地址: https://gitcode.com/gh_…...

线上服务偶发SSL握手失败?别急着改代码,先学会用Wireshark抓包定位真凶

线上服务偶发SSL握手失败?别急着改代码,先学会用Wireshark抓包定位真凶 当线上服务突然报出"Remote host closed connection during handshake"这类模糊错误时,很多工程师的第一反应是翻查SSL版本配置或证书信任策略。但真实情况往…...

PyTorch训练报错:CUDA device-side assert triggered?别慌,先检查你的标签和模型输出类别数

PyTorch训练中CUDA device-side assert错误的深度排查指南 当你正在全神贯注地训练一个分类模型,突然屏幕上跳出RuntimeError: CUDA error: device-side assert triggered的红色错误提示,那种感觉就像在高速公路上突然爆胎。更令人抓狂的是,…...

别再乱用shutdown了!Java线程池优雅关闭的3种正确姿势(附Spring Boot实战代码)

Java线程池优雅关闭实战指南:从原理到Spring Boot最佳实践 当你在凌晨三点被生产环境告警惊醒,发现服务因为线程池关闭不当导致数据丢失时,那种头皮发麻的感觉我太熟悉了。去年我们电商大促期间,就曾因为一个简单的shutdownNow()调…...

告别LVDS布线噩梦:手把手教你用JESD204B协议搞定高速ADC/DAC接口(附Subclass1配置要点)

高速数据采集设计革命:JESD204B协议实战指南与Subclass1配置精髓 第一次在项目中使用JESD204B接口时,我被它简洁的布线震撼了——原本需要几十对LVDS差分线的8通道ADC系统,现在只需要4对高速串行线就能搞定。但随后在调试阶段,当S…...

不止于连接:用ADB命令深度管理你的华为荣耀V9(文件传输、进程查看实战)

不止于连接:用ADB命令深度管理你的华为荣耀V9(文件传输、进程查看实战) 当你已经成功用ADB连接上荣耀V9,就像拿到了一把通往Android系统深处的钥匙。但大多数人只用来开个门就停下了——其实门后藏着整套工具间。上周帮同事调试应…...

仅剩17%头部AGI项目采用纯自注意力架构:2024 Q2全球23家AGI实验室架构迁移路线图全曝光

第一章:AGI的注意力机制与认知架构 2026奇点智能技术大会(https://ml-summit.org) 注意力机制已从Transformer中的序列建模工具,演进为AGI系统中支撑多模态感知、工作记忆调度与元认知调控的核心神经符号接口。在具备自主目标生成与跨任务迁移能力的AGI…...

STM32 Bootloader升级实战:如何为APP和Bootloader分别裁剪FATFS(只读/读写)

STM32 Bootloader升级实战:如何为APP和Bootloader分别裁剪FATFS(只读/读写) 在嵌入式系统开发中,Bootloader的设计往往需要面对一个现实问题:如何在有限的Flash空间内实现功能完备的固件升级方案?特别是当涉…...

航模老鸟的私藏笔记:SBUS协议高速/普通模式选择与失控保护(Flags位)实战配置指南

航模老鸟的私藏笔记:SBUS协议高速/普通模式选择与失控保护实战配置指南 穿越机在高速俯冲时突然失去遥控信号,眼睁睁看着设备撞向地面;固定翼在千米高空因信号干扰进入不可控状态...这些惊心动魄的场景,往往源于对SBUS协议底层配置…...

全球首份AGI行业渗透率年报(SITS2026机密版流出):制造业AGI渗透率飙升至34.7%,你的竞对已部署第3代智能体

第一章:SITS2026发布:AGI行业应用报告 2026奇点智能技术大会(https://ml-summit.org) SITS2026发布的《AGI行业应用报告》基于全球37个国家、214家头部企业的实证调研,首次系统性呈现通用人工智能在金融、医疗、制造与能源四大核心场景的规…...

用C语言手把手教你找出迷宫所有路径(附完整回溯算法代码)

用C语言手把手教你找出迷宫所有路径(附完整回溯算法代码) 迷宫问题一直是算法学习中的经典案例,它不仅考验编程基础,更是理解递归与回溯思想的绝佳实践。本文将带你从零开始,用C语言实现一个能够找出迷宫所有路径的完整…...

Visual Studio完全清理指南:终极免费工具彻底解决开发环境残留问题

Visual Studio完全清理指南:终极免费工具彻底解决开发环境残留问题 【免费下载链接】VisualStudioUninstaller Visual Studio Uninstallation sometimes can be unreliable and often leave out a lot of unwanted artifacts. Visual Studio Uninstaller is designe…...

保姆级教程:用微信小程序云开发 + wxml-to-canvas + pdf-lib 搞定页面转PDF(附完整源码)

零后端依赖:微信小程序云开发实现页面转PDF全流程实战 最近在独立开发小程序时,经常遇到需要将订单、报告等页面导出为PDF的需求。传统方案需要后端配合,但对于个人开发者或小型团队来说,这往往成为技术瓶颈。经过多次实践&#…...

【实战】AI图谱工具实战:Graphify vs GitNexus 深度对比,让AI读懂你的代码仓库

目录摘要一、问题背景:AI 读代码为什么又贵又蠢二、Graphify:面向 AI 助手的技能插件2.1 项目定位2.2 三阶段混合架构2.3 Token 缩减实测数据2.4 支持的代码语言(25 种)2.5 Always-On 集成机制2.6 安装与使用三、GitNexus&#xf…...

数据结构(四) 栈和队列 超详细讲解(原理 + 完整代码 + 算法题)

数据结构(四) 栈和队列 超详细讲解(原理 完整代码 算法题) 栈和队列是数据结构中最基础、最常用的两种线性结构,掌握它们是学习算法、操作系统、编译原理的基础。本文带你从概念 → 结构实现 → 高频算法题一站式吃透。 文章目录数据结构(…...

告别Ansible?Spug自动化运维平台Docker部署实战(附避坑指南)

告别Ansible?Spug自动化运维平台Docker部署实战与深度解析 当运维团队规模在5-20人之间时,传统运维工具往往面临两大困境:要么像Ansible这样需要复杂的Playbook编写,要么像SaltStack那样要求每台主机安装Agent。我曾见证一个电商团…...

从零到一:Roboguide软件安装、激活与许可证迁移全流程实战

1. Roboguide入门:从安装包到许可证迁移全解析 第一次接触Roboguide的朋友可能会被这个工业机器人仿真软件的专业性吓到,但别担心,我当初安装时也踩过不少坑。作为发那科机器人官方指定的仿真平台,Roboguide在汽车焊接、物料搬运等…...

深入Python字节码:一行`print(a)`引发的UnboundLocalError到底是怎么发生的?

深入Python字节码:一行print(a)引发的UnboundLocalError到底是怎么发生的? 在Python开发中,UnboundLocalError是一个让许多开发者困惑的报错。表面上看,它似乎只是提醒我们"变量在赋值前被引用",但背后隐藏着…...

OpenCV写视频踩坑实录:为什么你的MP4文件打不开?从编码器选择到参数配置的避坑指南

OpenCV视频保存实战:从编码器陷阱到播放兼容性的终极解决方案 当你兴奋地运行完Python脚本,看到视频文件成功生成,却发现播放器无法打开或画面异常时,那种挫败感我深有体会。这不是简单的代码错误,而是OpenCV视频保存过…...

从零到一:Roboguide许可证全生命周期管理实战指南

1. Roboguide许可证管理全景图 第一次接触Roboguide许可证时,我和大多数工程师一样踩过不少坑。记得有次项目交付前三天,突然发现试用期许可证过期,整个仿真环境瘫痪,最后不得不连夜联系供应商紧急处理。这段经历让我深刻意识到&a…...

biliTickerBuy终极指南:5分钟掌握B站会员购抢票技巧

biliTickerBuy终极指南:5分钟掌握B站会员购抢票技巧 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 在B站会员购的热门演出和限量周边抢购中,你是否总是因为手速不够快、…...

【AGI时代硬件生死线】:2026奇点大会未公开PPT流出——为什么92%的AI加速器将在2027年前被淘汰?

第一章:2026奇点智能技术大会:AGI与硬件设计 2026奇点智能技术大会(https://ml-summit.org) AGI架构演进对芯片微架构的倒逼效应 本届大会首次公开披露了基于因果推理引擎的AGI参考架构CausalNet-7,其训练阶段需持续调度跨模态张量流&#…...

Vivado新手必看:遇到DRC CFGBVS-1报错别慌,手把手教你设置这两个关键属性

Vivado设计中的电压配置陷阱:深度解析CFGBVS与CONFIG_VOLTAGE属性 第一次在Vivado中看到DRC CFGBVS-1报错时,那种手足无措的感觉我至今记忆犹新。作为一个FPGA设计新手,面对这个看似晦涩的警告信息,我花了整整两天时间才真正理解…...

别只盯着P值!用SPSSAU做验证性因子分析,这5个指标才是判断模型好坏的关键

别只盯着P值!用SPSSAU做验证性因子分析,这5个指标才是判断模型好坏的关键 在数据分析领域,验证性因子分析(CFA)是检验量表结构效度的黄金标准。然而,许多研究者常常陷入一个误区——过度依赖P值来判断模型优劣。实际上&#xff0c…...