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

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定义默认层指标可以提供帐户的例子吗?文档是一巨大的加号。


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

然而,在每一种情况下,省略的值都会以完全相同的方式被处理。这意味着,除非您对解释器进行黑客攻击(或使用parserast等模块),否则您可以假装默认值为"无"(正如recursive的答案所说),并且始终得到正确的答案。

所引用的非正式文档不太准确,这对于本应作为教程一部分的内容来说是合理的。对于真正的答案,您必须参考参考文档。

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

对于[i:j]

… If i is omitted or None, use 0. If j is omitted or None, use len(s).

对于[i:j:k]

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 is None, it is treated like 1.

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


我没有任何文档,但我认为默认值是[None:None:None]

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 that 0 <= n < (j-i)/k. In other words, the indices are i, 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 than len(s), use len(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 is None, it is treated like 1.

因此,您可以得到以下行为:

1
2
3
>>> s ="mystring"
>>> s[2:None:-1]
'sym'


结束值总是排它的,因此0结束值意味着包括索引1而不是0。用"无"代替(因为负数有不同的含义):

1
2
>>> s[len(s)-1:None:-1]
'gnirtsym'

注意起始值;最后一个字符索引在len(s) - 1处;您也可以将其拼写为-1(表示相对于长度的负数):

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


实际上,这是合乎逻辑的……

如果查找结束值,它总是指向最后一个索引之后的索引。因此,使用0作为结束值,意味着它得到索引1处的till元素。所以,您需要省略这个值。以便返回所需的字符串。

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')

了解您是否正在实现__getslice__j默认为sys.maxsize(https://docs.python.org/2/reference/datamodel.html object.getslice)

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