What are the default slice indices in Python *really*?
从Python教程/文件/ docs.python.org introduction.html #字符串:
Slice indices have useful defaults; an omitted first index defaults to zero, an omitted second index defaults to the size of the string being sliced.
案例的标准,这使得很多意义:
1 2 3 4 5 6 7 8 9 10 | >>> s = 'mystring' >>> s[1:] 'ystring' >>> s[:3] 'mys' >>> s[:-2] 'mystri' >>> s[-1:] 'g' >>> |
这么远,这么好的。然而,使用负的降压值似乎稍微不同的建议的缺陷:
1 2 3 4 5 6 | >>> s[:3:-1] 'gnir' >>> s[0:3:-1] '' >>> s[2::-1] 'sym' |
细步,也许如果是负,违约的反向。在ommitted缺省为第一指标的字符串的大小是小礼物,第二指数omitted缺省为零:
1 2 | >>> s[len(s):3:-1] 'gnir' |
很好!
1 2 | >>> s[2:0:-1] 'sy' |
哎呀。‘M’的原因。
然后有人最喜欢的字符串反向的声明。它是甜的。
1 2 | >>> s[::-1] 'gnirtsym' |
然而:
1 2 | >>> s[len(s):0:-1] 'gnirtsy' |
这层不包括价值的指数在第二层。我可以看到它这样做的一致性。
所以我想我开始理解的行为在不同的permutations大学排在它。然而,我得到的感觉是,特别是在第二个索引,默认值为负的指数第二步中定义的CAN的困境是一个术语。
任何人concisely CAN定义默认层指标可以提供帐户的例子吗?文档是一巨大的加号。
实际上没有任何默认值;省略的值将被特殊处理。
然而,在每一种情况下,省略的值都会以完全相同的方式被处理。这意味着,除非您对解释器进行黑客攻击(或使用
所引用的非正式文档不太准确,这对于本应作为教程一部分的内容来说是合理的。对于真正的答案,您必须参考参考文档。
对于2.7.3,序列类型在注释3、4和5中描述了切片。
对于
… If i is omitted or
None , use0 . If j is omitted orNone , uselen(s) .
对于
If i or j are omitted or
None , they become"end" values (which end depends on the sign of k). Note, k cannot be zero. If k isNone , it is treated like1 .
对于3.3,序列类型的措辞与2.7.3完全相同。
我没有任何文档,但我认为默认值是
1 2 3 4 | >>>"asdf"[None:None:None] 'asdf' >>>"asdf"[None:None:-1] 'fdsa' |
序列类型参考文档中的注释详细说明了这一点:
(5.) The slice of s from i to j with step k is defined as the sequence of items with index
x = i + n*k such that0 <= n < (j-i)/k . In other words, the indices arei ,i+k ,i+2*k ,i+3*k and so on, stopping when j is reached (but never including j). If i or j is greater thanlen(s) , uselen(s) . If i or j are omitted orNone , they become"end" values (which end depends on the sign of k). Note, k cannot be zero. If k isNone , it is treated like1 .
因此,您可以得到以下行为:
1 2 3 | >>> s ="mystring" >>> s[2:None:-1] 'sym' |
结束值总是排它的,因此0结束值意味着包括索引1而不是0。用"无"代替(因为负数有不同的含义):
1 2 | >>> s[len(s)-1:None:-1] 'gnirtsym' |
注意起始值;最后一个字符索引在
1 2 | >>> s[-1:None:-1] 'gnirtsym' |
实际上,这是合乎逻辑的……
如果查找结束值,它总是指向最后一个索引之后的索引。因此,使用
1 2 3 4 5 6 7 8 9 10 11 | >>> s = '0123456789' >>> s[0], s[:0] ('0', '') >>> s[1], s[:1] ('1', '0') >>> s[2], s[:2] ('2', '01') >>> s[3], s[:3] ('3', '012') >>> s[0], s[:0:-1] ('0', '987654321') |
了解您是否正在实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | >>> class x(str): ... def __getslice__(self, i, j): ... print i ... print j ... ... def __getitem__(self, key): ... print repr(key) ... >>> x()[:] 0 9223372036854775807 >>> x()[::] slice(None, None, None) >>> x()[::1] slice(None, None, 1) >>> x()[:1:] slice(None, 1, None) >>> import sys >>> sys.maxsize 9223372036854775807L |