是的,这是故意的,该对象被用作唯一的哨兵对象。它本身永远不会发生变化,也不会检查列表对象内容。它的唯一目的是拥有一个可以在is
test.
比较常用的是None
作为哨兵来测试某些内容是否尚未设置,但有时您需要考虑None
为有效设定值。在实施中deepcopy()
the _nil
对象用于替换None
:
y = memo.get(d, _nil)
if y is not _nil:
return y
这允许memo[d] = None
被设置为memo.get(d)
会回来None
两者如果memo[d]
存在或缺失:
>>> memo = {}; d = 'foo'
>>> _nil = []
>>> memo.get(d) is None
True
>>> memo.get(d, _nil) is _nil
True
>>> memo[d] = None
>>> memo.get(d) is None
True
>>> memo.get(d, _nil) is _nil
False
如果您正在考虑使用自己独特的非None
哨兵对象,这些天你可能想使用object()
. But object()
当Python语言中还不存在deepcopy()
函数已经写好了。
_nil
是一个参数,使其成为局部变数。这使得查找_nil
引用比模块中的全局引用便宜得多,请参阅为什么 Python 代码在函数中运行得更快? https://stackoverflow.com/questions/11241523/why-does-python-code-run-faster-in-a-function这对于可以轻松调用的函数来说很重要a lot当用于复制自定义对象的深度和广泛结构时。因此,正如名称中最初的下划线所示,_nil
是一个实现细节。
另请参阅有没有办法将默认参数设置为等于另一个参数值? https://stackoverflow.com/questions/17157272/is-there-a-way-to-set-a-default-parameter-equal-to-another-parameter-value