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:这样的写法,但要注意这会同时捕获False、0、空字符串、空列表等其他假值,容易意外覆盖。当仅关心是否为None时,明确写if x is None:更精确。
与其他“空”的对比
None是一个单例对象,不是数字 0,不是空字符串"",也不是空列表[]。- 这几个值在布尔测试中都是假值,但它们在程序中代表完全不同的含义:
0是数字零,""是空文本,[]是空容器,而None纯粹表示“无”。
实际开发中的提示
- 很多标准库和第三方库使用
None作为默认参数或表示“未设置/未启用”,你阅读文档或写代码时应习惯并遵循这种约定。 - 在类型提示中,如果变量可能为
None,可以标注为Optional[int]或int | None(Python 3.10+),这样静态检查工具(如 mypy)能帮你发现潜在的空值引用问题。