Python中的空对象

Python中的空对象

技术背景

在Python里,并没有像其他一些编程语言那样使用“null”来表示空对象。Python使用None这个单例对象来代表空值或缺失值。理解None的特性以及如何正确使用它,对于编写高质量的Python代码至关重要。

实现步骤

1. 引用空对象

在Python中,使用None来引用空对象。例如:

1
empty_variable = None

2. 检查对象是否为None

推荐使用is身份运算符来检查一个对象是否为None,因为is比较的是两个对象的身份(即是否为同一个对象)。示例如下:

1
2
3
foo = None
if foo is None:
print("foo is None")

3. 避免使用==比较

虽然==也可以用来比较对象是否等于None,但==运算符会调用对象的__eq__方法,而这个方法可能被重写,从而导致意外的结果。例如:

1
2
3
4
5
6
7
8
class Empty:
def __eq__(self, other):
return not other

empty = Empty()
print(empty == None) # 输出True
print(empty == '') # 输出True
print(empty is None) # 输出False

4. 将None用作信号值

None常用于函数的默认参数,以表示某个参数未被传入。例如:

1
2
3
def my_function(value, param=None):
if param is None:
print("param is not provided")

5. 处理None作为有效数据的情况

None可能是有效数据时,需要区分是数据本身为None,还是该数据不存在。可以使用try/except语句来处理这种情况。例如:

1
2
3
4
5
6
7
some_dict = {}
try:
value = some_dict['some_key']
if value is None:
print("'some_key' is set to None")
except KeyError:
print("'some_key' is missing from the dict")

6. 使用哨兵对象

如果代码中频繁使用try/except来区分None信号和None数据,可以使用哨兵对象。例如:

1
2
3
4
5
6
7
undefined = object()

def my_function(value, param1=undefined):
if param1 is undefined:
print("param1 was not passed")
else:
print("param1 is", param1)

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 检查对象是否为None
foo = None
if foo is None:
print("foo is None")

# 将None用作函数默认参数
def my_function(value, param=None):
if param is None:
print("param is not provided")

# 处理None作为有效数据的情况
some_dict = {}
try:
value = some_dict['some_key']
if value is None:
print("'some_key' is set to None")
except KeyError:
print("'some_key' is missing from the dict")

# 使用哨兵对象
undefined = object()
def my_function(value, param1=undefined):
if param1 is undefined:
print("param1 was not passed")
else:
print("param1 is", param1)

最佳实践

  • 使用is进行比较:始终使用is运算符来检查一个对象是否为None,而不是==
  • 明确使用None:在函数中,如果需要一个默认值来表示参数未被传入,使用None作为默认值,并在函数内部明确处理None的情况。
  • 使用哨兵对象:当None可能是有效数据时,使用哨兵对象来区分数据缺失和数据为None的情况。

常见问题

1. 为什么不能使用==来比较None

==运算符会调用对象的__eq__方法,而这个方法可能被重写,从而导致意外的结果。而is运算符比较的是对象的身份,不会受到__eq__方法的影响。

2. 能否重新赋值None

在较新的Python版本(2.4及以后)中,不能重新赋值None。尝试这样做会引发SyntaxError

3. Nonefloat('nan')有什么区别?

None表示空值或缺失值,而float('nan')表示非数字(Not a Number)。pandas库的isnull函数可以同时检查Nonefloat('nan'),但在纯Python中,需要使用不同的方法来检查它们。例如:

1
2
3
4
5
6
import pandas as pd
print(pd.isnull(None)) # 输出True
print(pd.isnull(float('nan'))) # 输出True

a = float('nan')
print((a != a) or (a == None)) # 输出True

Python中的空对象
https://119291.xyz/posts/2025-04-22.python-null-object-guide/
作者
ww
发布于
2025年4月22日
许可协议