【问题标题】:Is this slicing behavior defined?是否定义了这种切片行为?
【发布时间】:2016-11-12 05:57:30
【问题描述】:

我在处理 Python 的切片,遇到了意想不到的结果。

示例:

print([1, 2, 3][0:-4:-1])

返回[1]

print([1, 2, 3][0:-3:-1])
print([1, 2, 3][0:-2:-1])
print([1, 2, 3][0:-1:-1])

每一个都返回[](如预期的那样)。

这是怎么发生的?

谢谢,Reyha24。

【问题讨论】:

  • 你只问第一个例子吗?
  • @zondo:是的。其他的我都清楚。
  • 这是定义的行为。它类似于[1, 2, 3][2:3],只是向后而不是向前。

标签: python python-3.x slice


【解决方案1】:

slice 中,第一项(开始)包含在内。第二个参数(停止)是ex独占性的。当停止 -3 时,这意味着从 11。由于停止是独占的,因此排除了唯一的项目,结果为空。当给定 -2 时,它转换为索引 1。一旦给定索引 0,您就已经通过了索引 1,因为步长是负数。因此,结果为空。你会得到与 -1 类似的东西。但是,从末尾取 -4 会变成 -1,因为列表中只有三个项目。从 0 到 -1 有一个负步是可能的:索引 0 包括在内,索引 -1 不包括在内,因为它显示在列表的后面。

【讨论】:

  • 谢谢,宗多。你的回答太棒了!我想我混淆了一些东西。你能告诉我其他三个例子是如何得到结果的吗?因为如果我遵循这个规则,索引 0 处的元素应该被包含,对吧?
  • @Reyha24:非常好的观点。我想我也误会了。请参阅我编辑的答案。
【解决方案2】:

我认为如果您反转切片并转换为常规索引,这会更清楚。由于 python 使用半开间隔,[0:-4:-1] 转换为[1, 2, 3][-3:1]。在这种情况下,-3 对应于索引0,因此它转换为[1, 2, 3][0:1],这只是第一个元素。第二种情况,[0:-3:-1],转换为[-2:1],即[1:1],为空。第三种情况转换为[2:1],依此类推。

【讨论】:

    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多