在`L [2:4]`,什么是'2:4`?

时间:2014-04-18 14:18:17

标签: python slice

我读到一切都是Python中的对象。那么2:4中的L[2:4]是什么?它是切片的对象吗?当我在解释器中输入2:4时,会引发SyntaxError

2 个答案:

答案 0 :(得分:5)

不,2:4不是独立的独立语法。语法 : - 分段表达式转换为slice()对象,而[]项索引的上下文中工作。 slice()是内部类型,请参阅internal types documentation

lst[2:4]已翻译为lst[slice(2, 4, None)]。使用__getitem__方法的自定义类时,您可以看到这一点:

>>> class Demo:
...     def __getitem__(self, item):
...         return item
... 
>>> d = Demo()
>>> d[2]
2
>>> d[2:4]
slice(2, 4, None)
>>> d[2::-2]
slice(2, None, -2)

您可以直接创建这些对象,slice()是内置类型:

>>> help(slice)
Help on class slice in module builtins:

class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])
 |  
 |  Create a slice object.  This is used for extended slicing (e.g. a[0:10:2]).
[ ... ]

触发:对象的slice()部分;您甚至可以传入多个切片,即使没有标准库类型支持这样的索引:

>>> d[10:, :-5, ::-1, :]
(slice(10, None, None), slice(None, -5, None), slice(None, None, -1), slice(None, None, None))

该元组中的最后一个切片仅由一个:表示。

在索引中使用Ellipsis时,会创建一个相关对象...

>>> d[...]
Ellipsis

没有标准库类型也使用它,但是Numpy项目在很大程度上依赖于这个单例对象和多切片功能来为结构化数据做出奇妙的事情。

答案 1 :(得分:0)

Python允许切片列表和字符串。您需要为L创建一个对象才能使此语法生效。试试这些例子:

>>> L = [0,1,2,3,4,5,6]
>>> L[2:4]

>>> L = "This is a test"
>>> L[2:4]
>>> L[2:]
>>> L[:4]
>>> L[-3:]