Python 3에서 * my_list[:]
는 구문 설탕입니다. type(my_list).__getitem__(mylist, slice_object)
여기서 : slice_object
는 my_list
속성 (길이)과 표현식으로 구성된 슬라이스 객체 [:]
입니다. 이런 방식으로 동작하는 객체는 파이썬 데이터 모델에서 아래 첨자 가능이라고 합니다 . 여기를 참조 하십시오 . 목록과 튜플의 __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)
슬라이스가 무엇이든 항상 새 목록 객체가 반환되는지 직접 확인하십시오.