slice(start, stop, None) vs slice(start, stop, 1)

slice(start, stop, None) vs slice(start, stop, 1)

提问人:Joe 提问时间:8/8/2023 最后编辑:desertnautJoe 更新时间:8/17/2023 访问量:312

问:

我很惊讶地读到这里

and 参数默认为startstepNone

因为它还说:

slice(start, stop, step=1)

返回一个切片对象,该对象表示由 range(start, stop, step) 指定的索引集。

因此,我希望该参数的默认参数值为 。step1

我知道返回 ,但我很好奇是否总是返回与 相同的切片,或者是否有一些我无法想到的示例,它们将返回不同的切片。slice(a, b, None) == slice(a, b, 1)Falseslice(a, b, None)slice(a, b, 1)

我在这里关于切片的广泛帖子中找不到任何关于此的内容

评论

3赞 Alain T. 8/8/2023
这可能是默认参数和默认行为之间的区别。 当 None 时处理为 1,但仍存储为 None(这与 tan 1 不同)step
1赞 wim 8/8/2023
嗯,我想你发现了一个小的文档错误。切片的正确签名是 。slice(start, stop[, step])
1赞 Michael Butscher 8/8/2023
有人可能会实现一个函数或类,它以不同的方式解释步骤,因此需要知道切片是否被编写为例如。 或。1:51:5:1
1赞 wim 8/8/2023
我为文档错误添加了 github.com/python/cpython/pull/107756
1赞 wim 8/9/2023
@Joe 我同意范围比较不是很有帮助/准确。就个人而言,我只是将实例视为您从语法中接收到的内容,并且不要尝试与范围进行任何类比。slice(x, y, z)__getitem__obj[x:y:z]

答:

7赞 wim 8/8/2023 #1

Slice 的步骤确实默认为 None,但使用 step 和 对于所有实际目的应该是等效的。这是因为在实际使用该步骤的 C 代码中,有一些检查无论如何都会将 None 转换为 11None

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;
    }
    ...
}

如果您想知道为什么他们不直接默认,也许是因为用户可能仍然希望使用显式切片(例如),和/或让第三方类型有机会在他们的 // 实现中以不同的方式处理和处理。1NoneL[1:2:None]1None__getitem____setitem____delitem__

评论

0赞 OverLordGoldDragon 8/8/2023
“出于所有实际目的”,那么出于哪些不切实际的目的,它不会默认为?1
2赞 wim 8/8/2023
@OverLordGoldDragon 比较切片实例的相等性。
0赞 juanpa.arrivillaga 8/8/2023
实际使用在哪里?我假设,通过内部数据结构等?因为如果你创建然后它会打印,所以如果你正在编写自己的数据结构来支持切片,你必须显式处理PySlice_GetIndiceslists = slice(1, 10)print(s.stop)NoneNone
1赞 wim 8/8/2023
@juanpa.arrivillaga 它由切片实例的方法使用。我想你的意思不是......但是,是的,当然,如果你正在编写自己的数据结构,你就没有义务将 和 视为等价物。事实上,你甚至没有义务使用整数(我曾经实现过一个类,它使用字符串切片来实现某种功能。indicess.steps.stopstep=Nonestep=1
1赞 juanpa.arrivillaga 8/8/2023
啊,我不知道这种方法。我想对于给定的长度,然后给出所需的语义。slice_object1.indices(some_length) == slice_object2.indices(some_length)