小编典典

* really *是Python中的默认切片索引是什么?

python

从python文档docs.python.org/tutorial/introduction.html#strings:

切片索引具有有用的默认值。省略的第一索引默认为零,省略的第二索引默认为要切片的字符串的大小。

对于标准情况,这很有意义:

>>> s = 'mystring'
>>> s[1:]
'ystring'
>>> s[:3]
'mys'
>>> s[:-2]
'mystri'
>>> s[-1:]
'g'
>>>

到现在为止还挺好。但是,使用负值阶跃值似乎表明默认值略有不同:

>>> s[:3:-1]
'gnir'
>>> s[0:3:-1]
''
>>> s[2::-1]
'sym'

很好,如果步长为负,则默认为反向。省略的第一索引默认为要切片的字符串的大小,省略的第二索引默认为零:

>>> s[len(s):3:-1]
'gnir'

看起来不错!

>>> s[2:0:-1]
'sy'

哎呀 错过了那个“ m”。

然后是每个人最喜欢的字符串反向语句。甜蜜的是:

>>> s[::-1]
'gnirtsym'

然而:

>>> s[len(s):0:-1]
'gnirtsy'

切片永远不会在切片中包含第二个索引的值。我可以看到这样做的一致性。

因此,我想我开始了解slice在其各种排列中的行为。但是,我感到第二个索引有些特殊,并且负数步长的第二个索引的默认值实际上不能用数字来定义。

谁能简明地定义可以解释所提供示例的默认切片索引?文档将是一个巨大的优势。


阅读 223

收藏
2020-12-20

共1个答案

小编典典

实际上没有任何默认值。忽略的值将得到特殊处理。

但是,在每种情况下,碰巧忽略的值都与“无”完全相同。这意味着,除非你黑客攻击的解释(或使用parserast等模块),你可以假装默认值是无(递归的回答说),你会始终得到正确的答案。

引用的非正式文档不太准确-对于本教程要包含的内容而言,这是合理的。对于真实的答案,您必须转向参考文档。

对于2.7.3,“序列类型”描述了注释3、4和5中的切片。

对于[i:j]

…如果 被省略或者None,使用0。如果省略 jNone,请使用len(s)

对于[i:j:k]

如果省略 ijNone,它们将成为“结束”值(该结束取决于 k 的符号)。注意, k 不能为零。如果 k
None,则将其视为1

对于3.3,序列类型的措词与2.7.3完全相同。

2020-12-20