在尝试切片时,我注意到Python 2.7中有一个奇怪的行为:
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))
Run Code Online (Sandbox Code Playgroud)
在括号中使用单个冒号时,切片对象的开头为0,结尾为大整数.但是,当我使用多个冒号时,如果未指定,则start和stop为None.
这种行为是保证还是实现特定的?
的文档说,第二和第三壳体延伸切片,而第一种情况下则不是.但是,我找不到基本切片和扩展切片之间差异的任何明确解释.
当我覆盖__getitem__并希望接受扩展切片时,是否还有其他"特殊情况" ?
dhk*_*hke 10
对于Python 2 [:]仍然调用__getslice__(self, i, j)(不建议使用),并且记录slice(0, sys.maxsize, None)在使用默认参数调用时返回切片:
请注意,缺少
i或j在切片表达式中替换为零或sys.maxsize,...
(强调我的).__getslice__()默认情况下,新样式类不会实现
如果未
__getslice__()找到,则创建切片对象,然后传递给切片对象__getitem__().
Python 3不再支持__getslice__()它,而是为所有上述切片表达式构造一个slice()对象.并slice()具有None默认值:
注意:切片仅使用以下三种方法完成.像这样的电话
a[1:2] = b被翻译成
a[slice(1, 2, None)] = b等等.始终填写缺少切片项目
None.