>>> class List(list):
... def __getitem__(self, i):
... print i, type(i)
... return super(List, self).__getitem__(i)
...
>>> x = List([0,1,2,3])
>>> x[1:3:]
slice(1, 3, None) <type 'slice'>
[1, 2]
>>> x[1:3]
[1, 2]
为什么第二种情况不使用List.__getitem__
?它的用途是什么?
>>> x[::]
slice(None, None, None) <type 'slice'>
[0, 1, 2, 3]
>>> x[:]
[0, 1, 2, 3]
同样,为什么这里的差异不是这两个切片操作?
答案 0 :(得分:2)
language reference说明了一切。具体做法是:
自2.0版以来不推荐使用:支持切片对象作为参数
__getitem__()
方法。 (但是,CPython中的内置类型目前仍然实现__getslice__()
。因此,在实现切片时必须在派生类中覆盖它。)
和
被要求实施 self [i:j] ...
的评估
请注意,它无法处理self[i:j:]
...
答案 1 :(得分:0)
以下是python2.7 documentation中描述切片如何工作的部分:
切片现在选择具有索引k的所有项目,使得i <= k <1。 j其中i和j是指定的下限和上限。