默认的切片索引*真的*是多少?

2023-12-06

来自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'

哎呀。错过了那个“我”。

然后就是大家最喜欢的字符串反转语句。甜蜜的是:

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

However:

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

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

所以我想我开始理解切片在其各种排列中的行为。但是,我感觉第二个索引有些特殊,并且负步的第二个索引的默认值实际上不能用数字来定义。

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


实际上没有任何默认值;省略的值会被特殊处理。

然而,在每种情况下,省略值的处理方式恰好与 None 完全相同。这意味着,除非您破解解释器(或使用parser, ast等模块),你可以假装默认值是 None (如递归的答案所说),你总是会得到正确的答案。

引用的非正式文档不太准确,这对于本教程的一部分来说是合理的。要获得真正的答案,您必须查阅参考文档。

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

For [i:j]:

… If i被省略或None, use 0. If j被省略或None, use len(s).

And for [i:j:k]:

If i or j被省略或None,它们成为“最终”值(哪个结束取决于k)。笔记,k不能为零。如果k is None,它被视为1.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

默认的切片索引*真的*是多少? 的相关文章

随机推荐