提问人:Joe 提问时间:8/8/2023 最后编辑:desertnautJoe 更新时间:8/17/2023 访问量:312
slice(start, stop, None) vs slice(start, stop, 1)
slice(start, stop, None) vs slice(start, stop, 1)
问:
and 参数默认为
start
step
None
因为它还说:
slice(start, stop, step=1)
返回一个切片对象,该对象表示由 range(start, stop, step) 指定的索引集。
因此,我希望该参数的默认参数值为 。step
1
我知道返回 ,但我很好奇是否总是返回与 相同的切片,或者是否有一些我无法想到的示例,它们将返回不同的切片。slice(a, b, None) == slice(a, b, 1)
False
slice(a, b, None)
slice(a, b, 1)
我在这里关于切片的广泛帖子中找不到任何关于此的内容
答:
7赞
wim
8/8/2023
#1
Slice 的步骤确实默认为 None
,但使用 step 和 对于所有实际目的应该是等效的。这是因为在实际使用该步骤的 C 代码中,有一些检查无论如何都会将 None
转换为 1
:1
None
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]
1
None
__getitem__
__setitem__
__delitem__
评论
0赞
OverLordGoldDragon
8/8/2023
“出于所有实际目的”,那么出于哪些不切实际的目的,它不会默认为?1
2赞
wim
8/8/2023
@OverLordGoldDragon 比较切片实例的相等性。
0赞
juanpa.arrivillaga
8/8/2023
实际使用在哪里?我假设,通过内部数据结构等?因为如果你创建然后它会打印,所以如果你正在编写自己的数据结构来支持切片,你必须显式处理PySlice_GetIndices
list
s = slice(1, 10)
print(s.stop)
None
None
1赞
wim
8/8/2023
@juanpa.arrivillaga 它由切片实例的方法使用。我想你的意思不是......但是,是的,当然,如果你正在编写自己的数据结构,你就没有义务将 和 视为等价物。事实上,你甚至没有义务使用整数(我曾经实现过一个类,它使用字符串切片来实现某种功能。indices
s.step
s.stop
step=None
step=1
1赞
juanpa.arrivillaga
8/8/2023
啊,我不知道这种方法。我想对于给定的长度,然后给出所需的语义。slice_object1.indices(some_length) == slice_object2.indices(some_length)
评论
step
slice(start, stop[, step])
1:5
1:5:1
slice(x, y, z)
__getitem__
obj[x:y:z]