Python-slice([1,2,3])如何工作以及slice(None,[1,3],None)代表什么?

文档class slice(start, stop[, step])

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

代码中发生了什么以及为什么切片类 init 甚至允许列表作为其参数?

print(slice([1,3]))
---
slice(None, [1, 3], None)

print(slice(list((1,3))))
---
slice(None, [1, 3], None)  # why stop is list?

hoge = [1,2,3,4]
_s = slice(list((1,3)))
print(hoge[_s])
--------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-59-1b2df30e9bdf> in <module>
      1 hoge = [1,2,3,4]
      2 _s = slice(list((1,3)))
----> 3 print(hoge[_s])

TypeError: slice indices must be integers or None or have an __index__ method

更新

感谢塞尔丘克的回答。

sliceobject.c#L303-L322

static PyObject *
slice_new(PyTypeObject *type, PyObject *args, PyObject *kw)
{
    PyObject *start, *stop, *step;

    start = stop = step = NULL;

    if (!_PyArg_NoKeywords("slice", kw))
        return NULL;

    if (!PyArg_UnpackTuple(args, "slice", 1, 3, &start, &stop, &step))
        return NULL;

    /* This swapping of stop and start is to maintain similarity with
       range(). */
    if (stop == NULL) {
        stop = start;       // <-----
        start = NULL;
    }
      
    return PySlice_New(start, stop, step);  // PySlice_New in L110 in the same file
}

回答

从文档:

Slice 对象具有只读数据属性startstop并且step仅返回参数值(或它们的默认值)。它们没有其他显式功能 [...]

所以它们只是保持你传递给它们的任何东西的虚拟对象。您甚至可以传递字符串或其他对象:

my_slice = slice("foo", "bar", "baz")

[...] 但是它们被 Numerical Python 和其他第三方扩展使用。

这是第三方扩展的工作来验证,如果startstopstep值任何意义。

另请参阅CPython 实现。

当您只传递一个参数时,它被假定为stop值。这就是为什么你最终startstep值设置为None

class slice(stop)

class slice(start, stop[, step])


以上是Python-slice([1,2,3])如何工作以及slice(None,[1,3],None)代表什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>