从python文档中:
切片索引有有用的默认值;省略的第一个索引默认为零,省略的第二个索引默认为要切片的字符串的大小。
对于标准情况,这很有意义:
>>> 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'
好吧,如果步骤为负,则默认值将反转。ommitted第一个索引默认为要切片的字符串的大小,省略的第二个索引默认为零:
>>> s[len(s):3:-1]
'gnir'
看起来不错!
>>> s[2:0:-1]
'sy'
哇哦。错过了“M”。
然后是每个人最喜欢的字符串反转语句。很甜的是:
>>> s[::-1]
'gnirtsym'
然而:
>>> s[len(s):0:-1]
'gnirtsy'
切片从不包含切片中第二个索引的值。我可以看到这样做的一贯性。
所以我想我开始理解slice在其各种排列中的行为。但是,我感觉第二个索引有点特别,并且负阶跃的第二个索引的默认值实际上不能用数字来定义。
是否有人能简洁地定义可以解释所提供示例的默认切片索引?文档将是一个巨大的优势。
最佳答案
实际上没有任何默认值;省略的值将被特殊处理。
然而,在每一种情况下,省略的值都会以完全相同的方式被处理。这意味着,除非您正在对解释器进行黑客攻击(或使用parser
、ast
等模块),否则您可以假装默认值为“无”(正如recursive's answer所说),并始终获得正确的答案。
所引用的非正式文档不太准确,这对于本应作为教程一部分的内容来说是合理的。对于真正的答案,您必须参考参考文档。
对于2.7.3,Sequence Types在注释3、4和5中描述了切片。
对于[i:j]
:
…如果省略或None
,请使用0
。如果省略j或None
,请使用len(s)
。
对于[i:j:k]
:
如果省略i或j或None
,它们将变为“end”值(哪一端取决于k的符号)。注意,k不能为零。如果k为None
,则按1
处理。
对于3.3,Sequence Types的措辞与2.7.3完全相同。
关于python - Python *中的默认切片索引是什么*?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12521798/