Python 3. *のmy_list[:]
構文シュガーtype(my_list).__getitem__(mylist, slice_object)
は次のとおりslice_object
です。は、my_list
の属性(長さ)と式から構築されたスライスオブジェクト[:]
です。このように動作するオブジェクトは、Pythonデータモデルでは添え字付きと呼ばれ、ここを参照してください。リストとタプル__getitem__
の組み込みメソッドです。
CPythonでは、リストとタプルの場合、ここのタプルとここのリストに実装さ__getitem__
れているバイトコード操作によって解釈されます。BINARY_SUBSCR
タプルの場合、コードを歩くと、このコードブロックで、項目がタイプでスライスがタプル全体に評価される場合、入力引数として取得し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)
、スライスが何であれ、常に新しいリストオブジェクトが返されることを確認します。