飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 Python简介

    • Python是什么
    • 安装与运行
    • 交互式解释器
    • 注释与编码规范
  • 第2章 变量与数据类型

    • 变量与对象
    • 整数 int
    • 浮点数 float
    • 复数 complex
    • 布尔值 bool
    • 字符串 str
    • 空值 None
    • 类型转换
  • 第3章 运算符与表达式

    • 算术运算符
    • 比较运算符
    • 赋值运算符
    • 逻辑运算符
    • 位运算符
    • 身份与成员运算符
    • 海象运算符
    • 运算符优先级
  • 第4章 流程控制

    • if 语句
    • if-else 语句
    • if-elif-else 语句
    • match-case 语句
    • 条件表达式(三元运算符)
    • while 循环
    • for 循环
    • range 函数
    • break 与 continue
    • 循环的 else 子句
    • pass 语句
  • 第5章 数据结构

    • 列表创建与索引
    • 列表方法
    • 列表推导式
    • 元组
    • 序列解包
    • 集合
    • 字典创建与访问
    • 字典方法
    • 字典推导式
    • range 对象
  • 第6章 函数

    • 定义函数
    • 位置参数与关键字参数
    • 默认参数
    • 可变参数
    • 解包实参
    • 函数返回值
    • lambda 表达式
    • 文档字符串与注解
    • 作用域与命名空间
    • global 与 nonlocal
  • 第7章 模块与包

    • 模块导入
    • 模块搜索路径
    • 包与相对导入
    • 标准库概览
  • 第8章 文件与输入输出

    • 文件读写
    • 上下文管理器
    • 字符串格式化
    • JSON 与 CSV
  • 第9章 面向对象

    • 类与对象
    • 方法
    • 实例变量与类变量
    • 私有变量
    • 继承
    • 多重继承
    • 魔术方法
    • 属性装饰器
    • 数据类 dataclass
  • 第10章 异常处理

    • 语法错误与异常
    • try-except
    • 异常链与 raise
    • 清理操作
    • 自定义异常
  • 第11章 迭代器与生成器

    • 迭代器协议
    • 生成器
    • 生成器表达式
    • 迭代工具
  • 第12章 高级特性

    • 装饰器
    • 函数式编程
  • 第13章 工程实践

    • 测试与调试
    • 代码质量
    • 虚拟环境

空值 None

None 是 Python 中 NoneType 类型的唯一实例,用于表示"什么都没有"、"不存在"或"未设置"。它在函数返回值、默认参数和哨兵值等场景中扮演重要角色。

None 的本质

None 是单例对象,整个 Python 进程中只有一个 None 实例:

a = None
b = None
print(a is b)        # True
print(type(a))       # <class 'NoneType'>

NoneType 不能创建新实例,也不能被继承:

# 以下均非法
# x = NoneType()     # NameError/TypeError
# class MyNone(NoneType): pass   # TypeError

None 与 False、0、"" 的区别

初学者常混淆这些"空"值,但它们含义不同:

print(None == False)     # False
print(None == 0)         # False
print(None == "")        # False
print(bool(None))        # False,但 None 不是 False

在布尔上下文中它们都为假,但类型和语义截然不同:

值类型含义
NoneNoneType不存在、未设置
Falsebool逻辑假
0int数值零
""str空字符串
[]list空列表
def check(value):
    if value is None:
        return "未设置"
    if value == "":
        return "空字符串"
    if value == 0:
        return "数值零"
    if not value:
        return "其他假值"
    return "有值"

print(check(None))       # 未设置
print(check(""))         # 空字符串
print(check(0))          # 数值零
print(check([]))         # 其他假值
print(check("hello"))    # 有值

用 is None 判断

判断一个值是否为 None,必须使用 is 运算符,而非 ==:

# 不推荐
if x == None:
    pass

# 推荐
if x is None:
    pass

# 同样推荐
if x is not None:
    pass

原因有二:一是 None 是单例,is 比较身份更高效;二是某些类可能重载 __eq__ 使 == None 产生意外结果:

class Weird:
    def __eq__(self, other):
        return True

w = Weird()
print(w == None)         # True,意外!
print(w is None)         # False,正确

函数默认返回 None

如果函数没有显式 return 语句,或 return 后无值,则返回 None:

def greet(name):
    print(f"Hello, {name}")

result = greet("world")
print(result)            # None

这是设计上的选择:副作用型函数不需要返回值,调用者不应依赖其返回值做逻辑判断。

默认参数的陷阱

None 常用于避免可变默认参数的问题:

# 错误:默认参数在函数定义时求值,共享同一列表
def append_item_wrong(item, lst=[]):
    lst.append(item)
    return lst

print(append_item_wrong(1))   # [1]
print(append_item_wrong(2))   # [1, 2],意外!

# 正确:用 None 作为哨兵
def append_item_right(item, lst=None):
    if lst is None:
        lst = []
    lst.append(item)
    return lst

print(append_item_right(1))   # [1]
print(append_item_right(2))   # [2],正确

作为哨兵值

当 0、False、"" 都是合法数据时,None 是表示"未提供"的唯一选择:

def find_user(user_id, default=None):
    if user_id < 0:
        return default
    return {"id": user_id, "name": "Alice"}

print(find_user(-1))              # None
print(find_user(-1, default=0))   # 0

边界情况

None 不支持任何运算:None + 1、None * 2、None[0]、len(None) 均抛出 TypeError。

None 在容器中的行为:

lst = [None, None, 1]
print(len(lst))        # 3,None 是合法元素
print(lst.count(None)) # 2

print() 的返回值:

result = print("hello")
print(result)          # None,print 返回 None

None 是 Python 数据模型中表达"缺失"的标准方式。正确使用 is None 判断、避免与 False 混淆、利用它解决默认参数问题,是写出健壮代码的基本功。

上一页
字符串 str
下一页
类型转换