人人都会AI编程

None 类型

更新时间:2026-07-12

None 是 Python 中表示“没有值”或“空”的关键字,它自己就是一个类型。你只需要记住一句话:当某个变量或返回值暂时没有有意义的内容时,就用 None 来表示。

result = None   # 变量可以先初始化为 None,后面再赋值
user = None     # user 还没有实际对象

None 的本质

  • None 的类型是 NoneType,并且整个 Python 进程中只有一个 None 实例。这意味着所有被赋值为 None 的变量,都指向同一个对象。
  • 检查一个对象是否是 None,应该使用 is 而不是 ==is 比较的是对象身份,== 比较的是值,而 None 只有一个,用 is 更快且更准确)。
if result is None:      # 正确的写法
    print("没有结果")

常见使用场景

  • 函数没有显式 return:如果一个函数内部没有写 return 语句,它会默认返回 None
  • 占位符和默认值:在定义函数参数时,常用 None 作为可变参数的默认值(避免可变默认参数陷阱),或者让函数知道调用者没有提供该参数。
  • 数据缺失标记:在数据处理中,例如读取 CSV 文件的空单元格,或用字典获取不存在的键并指定默认值时,None 常作为“缺失数据”的标记。
def get_user(name=None):
    if name is None:
        return "未指定姓名"
    return f"用户: {name}"

判断 None 的注意事项

  • 始终用 x is None 而不写 x == None,因为后者可能被某些自定义类的 eq 方法覆盖,导致奇怪的结果。
  • 在布尔上下文中,None 被视为假值(False)。所以你可能会看到 if not x: 这样的写法,但要注意这会同时捕获 False0、空字符串、空列表等其他假值,容易意外覆盖。当仅关心是否为 None 时,明确写 if x is None: 更精确。

与其他“空”的对比

  • None 是一个单例对象,不是数字 0,不是空字符串 "",也不是空列表 []
  • 这几个值在布尔测试中都是假值,但它们在程序中代表完全不同的含义:0 是数字零,"" 是空文本,[] 是空容器,而 None 纯粹表示“无”。

实际开发中的提示

  • 很多标准库和第三方库使用 None 作为默认参数或表示“未设置/未启用”,你阅读文档或写代码时应习惯并遵循这种约定。
  • 在类型提示中,如果变量可能为 None,可以标注为 Optional[int]int | None(Python 3.10+),这样静态检查工具(如 mypy)能帮你发现潜在的空值引用问题。