在Python 3. * my_list[:]
中,语法糖适用type(my_list).__getitem__(mylist, slice_object)
于:slice_object
是从my_list
属性(length)和expression 构建的切片对象[:]
。这种行为的对象在Python数据模型中称为可下标的,请参见此处。对于列表和元组__getitem__
是一种内置方法。
在CPython中,对于列表和元组,__getitem__
由字节码操作解释,该字节码操作BINARY_SUBSCR
是针对此处的元组和此处的列表实现的。
如果是元组,则遍历代码,您将看到在此代码块中,如果item是类型并且切片求值为整个元组,static PyObject*
tuplesubscript(PyTupleObject* self, PyObject* item)
则将返回PyTupleObject
对其作为输入参数的引用PySlice
。
static PyObject*
tuplesubscript(PyTupleObject* self, PyObject* item)
{
/* checks if item is an index */
if (PyIndex_Check(item)) {
...
}
/* else it is a slice */
else if (PySlice_Check(item)) {
...
/* unpacks the slice into start, stop and step */
if (PySlice_Unpack(item, &start, &stop, &step) < 0) {
return NULL;
}
...
}
/* if we start at 0, step by 1 and end by the end of the tuple then !! look down */
else if (start == 0 && step == 1 &&
slicelength == PyTuple_GET_SIZE(self) &&
PyTuple_CheckExact(self)) {
Py_INCREF(self); /* increase the reference count for the tuple */
return (PyObject *)self; /* and return a reference to the same tuple. */
...
}
现在,您检查其代码,static PyObject *
list_subscript(PyListObject* self, PyObject* item)
并亲自查看无论切片如何,始终会返回一个新的列表对象。