Python - 基本与扩展切片

时间:2016-08-19 11:14:23

标签: python python-2.7

在尝试切片时,我注意到Python 2.7中存在一种奇怪的行为:

false
true

在括号中使用单个冒号时,切片对象的开头为0,结尾为大整数。但是,当我使用多个冒号时,如果未指定,则start和stop为None。

此行为是保证还是特定于实现?

Documentation表示第二种和第三种情况是扩展切片,而第一种情况则不是。但是,我无法找到基本切片和扩展切片之间差异的明确解释。

还有其他"特殊情况"当我覆盖class A: def __getitem__(self, i): print repr(i) a=A() a[:] #Prints slice(0, 9223372036854775807, None) a[::] #prints slice(None, None, None) a[:,:] #prints (slice(None, None, None), slice(None, None, None)) 并希望接受扩展切片时我应该注意哪些?

1 个答案:

答案 0 :(得分:10)

对于Python 2 [:]仍然调用__getslice__(self, i, j)(不建议使用),并且记录在使用默认参数调用时返回切片slice(0, sys.maxsize, None)

  

请注意,切片表达式中缺少ij将替换为 sys.maxsize ,... < / p>

(强调我的)。 默认情况下,新样式类不实现__getslice__(),所以

  

如果未找到__getslice__(),则会创建切片对象,而是传递给__getitem__()

Python 3不再支持__getslice__(),而是支持所有上述切片表达式的constructs a slice()对象。 slice()默认为None

  

注意:切片仅使用以下三种方法完成。像

这样的电话      

a[1:2] = b

     

被翻译为

     

a[slice(1, 2, None)] = b

     

等等。缺少切片项目始终使用None填充。