HOWTO · Python
如何在 Python 中声明一个没有值的变量
了解 Python 如何处理未绑定的名称、`None` 占位符、没有赋值的注解,以及空字符串或空列表值。
本页内容
要为稍后提供的值准备一个变量,请将 None 赋为占位符。Python 只有在赋值运行时才会绑定名称;仅仅提及一个名称或编写注解并不会赋予它运行时值。当您需要记录类型而不赋值时,请使用变量注解;或者当空字符串或空列表正是您希望的起始值时,请赋予它们。
Python 如何处理没有赋值变量
在 Python 中,赋值会在名称和对象之间创建绑定。在当前作用域中尚未赋值的名称是未绑定的。读取它会引发 NameError;它不是一个持有特殊“无”值的变量。在选择如何表示稍后提供的数据时,这一区别非常重要。
下面的选项会创建不同的状态:None 是一个已赋值的占位符,注解记录类型信息而不赋值,而空字符串或空列表是一个已赋值的对象,可以立即使用。
将 None 赋为占位符
当名称现在应该存在,但有意义的值尚不可用时,请赋予 None。None 是 Python 用于表示缺失的单例对象;赋予它会绑定名称,因此这与让名称保持未绑定不同。用 is None 检查它。
运行这个完整的示例来比较这三种选择:
profile = None
message = ""
items = []
if profile is None:
profile = {"name": "Ada"}
message += "Hello"
items.append("first")
print(profile["name"])
print(message)
print(items)
检查之后,profile 指向一个字典。None 参数默认值可以区分省略的参数和提供的非 None 值,因为提供的值会替换默认值。它无法区分省略和显式的 None;当这些调用必须被不同对待时,请使用一个唯一的哨兵对象作为默认值。
使用变量注解而不赋值
变量注解可以记录预期的类型,而不将运行时值绑定到名称:
name: str
这是一个注解,而不是赋值。该注解可能通过包含它的模块或类的注解数据获得,但在赋值之前读取 name 仍然会引发 NameError。如果后面的代码需要读取该值,请先赋一个值,例如 name = "Ada"。当记录预期类型有用且赋值应在其他地方发生时,请使用仅注解的语法。
当需要空值时使用空字符串或空列表
当空值已经是您任务的正确起始值时,请赋予空值。空字符串仍然是字符串,空列表仍然是列表;两者都不代表未绑定的名称或 None 占位符。
上面的示例将 message 以空字符串开始,将 items 以空列表开始,然后添加内容。选择与您计划存储的数据相匹配的类型。列表以后可以用 append() 或 extend() 等方法填充。
选择与您意图相符的形式
- 当缺失有意义且名称应该已经绑定时,使用
None。在替换或使用占位符之前,用is None检查它。 - 当您需要记录预期类型但不想在该点赋值时,使用诸如
name: str的注解。它不会使名称在运行时可读。 - 当空字符串或空集合是您的代码需要的实际初始值时,使用
""或[]。
如果读取引发 NameError,请先检查在该作用域中是否已运行赋值。如果您需要占位符,请赋予 None,或者初始化您的代码将使用的值。不要使用仅注解的语法来代替运行时初始化。