关于超范围指数的部分问题
切片逻辑自动将索引剪辑到序列的长度。
为了方便起见,允许切片索引扩展到超过端点。必须对每个表达式进行范围检查,然后手动调整限制,这将是一件很痛苦的事情,所以Python会为您这样做。
考虑希望显示不超过文本消息前50个字符的用例。
简单的方法(Python现在做的事情):
preview = msg[:50]
或者困难的方法(自己做极限检查):
n = len(msg)
preview = msg[:50] if n > 50 else msg
手动实现端点调整的逻辑很容易被忘记,也很容易出错(在两个地方更新50),很冗长,而且速度很慢。Python将这种逻辑移动到其内部,使其简洁、自动、快速和正确。这就是我喜欢蟒蛇的原因之一——)
关于分配长度与输入长度不匹配的部分问题
OP还想知道允许诸如
p[20:100] = [7,8]
其中,分配目标的长度(80)与替换数据的长度(2)不同。
用弦作类比最容易看出动机。考虑一下,
"five little monkeys".replace("little", "humongous")
. 注意目标“小”只有六个字母,“大”有九个字母。我们对列表也可以这样做:
>>> s = list("five little monkeys")
>>> i = s.index('l')
>>> n = len('little')
>>> s[i : i+n ] = list("humongous")
>>> ''.join(s)
'five humongous monkeys'
这一切归根结底都是为了方便。
在引入
复制()
和
清除()
方法,这些习惯用语:
s[:] = [] # clear a list
t = u[:] # copy a list
即使现在,我们在筛选时也会使用此项更新列表:
s[:] = [x for x in s if not math.isnan(x)] # filter-out NaN values
希望这些实际的例子能给我们一个很好的视角来解释为什么切片可以像它那样工作。