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

usu*_* me 1 python slice

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

Mar*_*ers 5

不,2:4不是独立的独立语法.语法 : -separtated表达式转换为slice()对象,而[]项目索引的上下文中起作用.slice()是内部类型,请参阅内部类型文档.

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)
Run Code Online (Sandbox Code Playgroud)

您可以直接创建这些对象,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]).
[ ... ]
Run Code Online (Sandbox Code Playgroud)

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

>>> d[10:, :-5, ::-1, :]
(slice(10, None, None), slice(None, -5, None), slice(None, None, -1), slice(None, None, None))
Run Code Online (Sandbox Code Playgroud)

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

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

>>> d[...]
Ellipsis
Run Code Online (Sandbox Code Playgroud)

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