我查看了why-does-list-1-not-equal-listlenlist-1和what-are-the-default-slice-indices-in-python-really的热门答案,了解切片中默认值的设置。两个最佳答案都参考以下文档:
给定s[i:j:k]
,
如果省略i或j或None,则它们变为“结束”值(其结束取决于k的符号)。注意,k不能为零。如果k为None,则将其视为1。
假设我有以下代码:
s = "hello"
forward_s = s[::1]
print(forward_s) # => "hello"
backward_s = s[::-1]
print(backward_s) # => "olleh"
我知道如果省略索引,那么Python会将其视为None
的值在那些地方使用。根据文档,i
中j
和[i:j:k]
的索引设置为“结束”值,具体取决于k
的符号。对于正k
,我假设i
设置为0
,j
设置为字符串的长度。为负k
设置的值是多少?
例如,以下内容也会反转字符串:
reversed_str = s[-1:-6:-1]
因此i
的默认值设置为-1
,而j
的{{1}}设置为-len(s) - 1
?
答案 0 :(得分:1)
default values为None
,None
和None
。
class Sliceable(object):
def __getitem__(self, slice):
print(slice)
Sliceable()[::]
>>> slice(None, None, None)
这与slice()
确实需要stop
参数无关。库文档对此有点不那么明确,但是C API makes clear,所有三个值都可能为空:
start
,stop
和step
参数用作相同名称的切片对象属性的值。任何值都可以是NULL
,在这种情况下,None
将用于相应的属性。
它可以通过切片对象来理解默认值。约定是使用内置集合实现的第一个元素,过去的最后一个元素,最小步进:< / p>
l = [1, 2, 3]
l[slice(None, None, None])
>>> [1, 2, 3]
s[None:None:None])
>>> [1, 2, 3]
否定步进将导致默认start
和end
值在语义上反转,即:
s = 'abc'
s[slice(None, None, -1)]
>>> 'cba'
s[::-1]
>>> 'cba'
请注意,这并不意味着简单的值翻转,end
的默认值通常是&#34; 一个超过序列结尾的任何方向&#34 ;,因为range()
不包括结束值,但切片的默认值应包括完整序列。
记录在案here:
s[i:j:k]
s
从i
到j
的切片k
被定义为索引为x = i + n*k
的项目序列,0 <= n < (j-i)/k
}。换句话说,索引为i, i+k, i+2*k, i+3*k
,依此类推,在达到j
时停止(但从不包括j
)。如果k
为正数,则i
和j
会缩小为len(s)
。当k
为否定时,i
和j
如果更高则会减少为len(s) - 1
。如果省略i
或j
或无,则它们将成为“结束”值(结束取决于k
的符号)。请注意,k
不能为零。如果k
为None
,则会将其视为1
。