Slice的步骤确实是defaults to None
,但使用步骤1
和None
对于所有实际目的都应该是相同的.这是因为在实际使用该步骤的C代码中,there are checks which transform None
into 1
anyway:
int
PySlice_GetIndices(PyObject *_r, Py_ssize_t length,
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
{
PySliceObject *r = (PySliceObject*)_r;
if (r->step == Py_None) {
*step = 1;
} ...
}
以及:
int
PySlice_Unpack(PyObject *_r,
Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
{
PySliceObject *r = (PySliceObject*)_r;
...
if (r->step == Py_None) {
*step = 1;
}
...
}
如果您想知道为什么它们不直接默认为1
,也许是因为用户可能仍然想显式地使用None
切片(例如L[1:2:None]
),和/或给第三方类型在其__getitem__
/__setitem__
/__delitem__
实现中以不同的方式处理1
和None
的机会.