python - 了解列表切片中的负步骤

标签 python list slice negative-number

我正在尝试理解以下行为,欢迎任何引用(尤其是官方文档)或评论。

让我们考虑一个列表:

>>> x = [1,2,3,4,5,6]

这按预期工作

>>> x[-1:-4:-1] 
[6, 5, 4]

但令我惊讶的是以下内容是空的:

>>>  x[0:-4:-1] 
[]

因此,我很惊讶下面不是空的

>>> x[0:-len(x)-1:-1]
> [1]

尤其是考虑到这一点

>>> x[0:-len(x):-1] 
[]

还有那个

>>> x[0:-len(x)-1] 
[]

是空的。

最佳答案

我被指向了引用实现(hattip to the Anonymous Benefactor)并发现从那里理解行为是相当简单的。总而言之,恕我直言,这种行为是不直观的,但它定义明确并且与引用实现相匹配。

有两个 CPython 文件是相关的,即描述 list_subscript 的文件和 PySlice_AdjustIndices .在这种情况下,从列表中检索切片时,将调用 list_subscript。它调用 PySlice_GetIndicesEx,后者又调用 PySlice_AdjustIndices。 现在 PySlice_AdjustIndices 包含简单的 if/then 语句,用于调整索引。最后它返回切片的长度。对于我们的例子,行

if (*stop < 0) {
    *stop += length;
    if (*stop < 0) {
        *stop = (step < 0) ? -1 : 0;
    }
}

特别相关。调整后,x[0:-len(x)-1:-1]变为x[0:-1:-1],返回长度1 .但是当x[0:-1:-1]传给adjust时,就变成了x[0:len(x)-1:-1]的长度0. 换句话说,在这种情况下,f(x) != f(f(x))

有趣的是,PySlice_AdjustIndices 中有以下注释:

/* this is harder to get right than you might think */

最后,请注意,python docs 中没有描述所讨论情况的处理。 .

关于python - 了解列表切片中的负步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41783307/

相关文章:

Python 请求模块不适用于带路径的 url

python - 通过每个项目的两个第一个值优化列表列表中的频率

list - 在 ocaml 中构建整数列表

javascript - 数组不会 split (使用 splice(0))

Python:搜索最大数据

Python 脚本只在 Docker 中产生僵尸进程

python - 为什么python floor division operator的行为是这样的?

python - 如何拆分 Python 列表的每个第 N 个元素

javascript - 首先 .slice() 然后对所有其他元素执行操作

python - python分配 "mylist[:] = somelist"与 "mylist = somelist"有何不同