为什么 slice 和 range 上限是排他的?

新手上路,请多包涵

我知道当我使用 range([start], stop[, step])slice([start], stop[, step]) 时, stop不包含 在范围或切片中。

为什么 会这样呢?

是不是这样,例如 range(0, x)range(x) 将包含 x 许多元素?

它是否与 C for 循环习语并行,即 for i in range(start, stop): 表面上类似于 for (i = start ; i < stop; i++) {


另请参阅 使用索引向后循环 以进行案例研究:设置 stopstep 正确设置值在尝试按降序获取值时可能会有点棘手。

原文由 wap26 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 411
2 个回答

文档 暗示这有一些有用的属性:

 word[:2]    # The first two characters
word[2:]    # Everything except the first two characters

这是一个有用的切片操作不变量: s[:i] + s[i:] 等于 s

对于非负索引,切片的长度是索引的差异,如果两者都在边界内。例如, word[1:3] 的长度是 2

我认为我们可以假设范围函数的行为相同以保持一致性。

原文由 Toomai 发布,翻译遵循 CC BY-SA 3.0 许可协议

以下是一些 Google+ 用户的 意见

[…] 我被半开区间的优雅所震撼。特别是当两个切片相邻时,第一个切片的结束索引是第二个切片的起始索引的不变量太漂亮了,无法忽略。例如,假设您在索引 i 和 j 处将字符串分成三部分——这些部分将是 a[:i]、a[i:j] 和 a[j:]。

Google+ 已关闭,因此链接不再有效。剧透警报:那是 Guido van Rossum。

原文由 Nigel Tufnel 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题