xozzslip
@xozzslip
Чекни мой канал о кодинге https://bit.ly/2LNBAL8

Что происходит на самом деле, когда мы вызываем __getitem__ в python?

Для меня ясно, что происходит в C при обращении к какому-либо элементу массива: берём указатель на первый элемент массива и прибавляем к нему необходимый отступ, который вычисляется как произведение номера желаемого элемента и размера этого элемента.
А в питоне в контейнерных последовательностях, вроде list или tuple могут находиться неоднородные по занимаемой памяти объекты. Однако работает операция за O(1). Как?
  • Вопрос задан
  • 423 просмотра
Решения вопроса 1
@RokkerRuslan
Потому что python list это не связный список, а вектор.
PyObject *
PyList_GetItem(PyObject *op, Py_ssize_t i)
{
    // Some code
    return ((PyListObject *)op) -> ob_item[i];
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@abcd0x00
list и tuple хранят не объекты, а адреса объектов.

>>> a = [1, 2, 3]
>>> 
>>> tup = (a, a, a)
>>> 
>>> tup
([1, 2, 3], [1, 2, 3], [1, 2, 3])
>>> 
>>> a[0] = 10
>>> 
>>> tup
([10, 2, 3], [10, 2, 3], [10, 2, 3])
>>>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
05 апр. 2020, в 10:15
2500 руб./за проект
05 апр. 2020, в 10:13
400 руб./за проект
05 апр. 2020, в 09:51
3000 руб./за проект