在尝试切片时,我注意到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))
并希望接受扩展切片时我应该注意哪些?
答案 0 :(得分:10)
对于Python 2 [:]
仍然调用__getslice__(self, i, j)
(不建议使用),并且记录在使用默认参数调用时返回切片slice(0, sys.maxsize, None)
:
请注意,切片表达式中缺少
i
或j
将替换为零或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
填充。