Где хранится ссылка arr из arr = [1, 2, 3]? - PullRequest
0 голосов
/ 16 октября 2018

Предположим, такой фрагмент кода C

//ptr_ops.c -- pointer operations
#include <stdio.h>
int main(void)
{
    int arr[] = {100, 200, 300, 400, 500};
    int *ptr1, ptr2, ptr3;

    ptr1 = arr;
    printf("&ptr1 = %p, ptr1 = %p, *ptr1 = %d", &ptr1, ptr1, *ptr1);

    return 0;
}

Это производит:

In [11]: !./a.out
&ptr1 = 0x7ffeeefc9790, ptr1 = 0x7ffeeefc97a0, *ptr1 = 100

Я пришел к выводу, что:

ptr1 = 0x7ffeeefc97a0 это arr[]address, &ptr1 - это место, где хранится указатель или сама переменная.

Что касается python

In [12]: arr = [1, 2, 3]
In [13]: hex(id(arr))
Out[13]: '0x106065088'

'0x106065088' - это адрес значения arr, как насчет ссылки "arr"где хранится?

1 Ответ

0 голосов
/ 16 октября 2018

Ссылки на имена верхнего уровня связаны через пространства имен модулей.Если вы работаете в интерпретаторе, модуль называется __main__.Модули обычно имеют атрибут __dict__, который ссылается на сопоставление всех имен верхнего уровня (например, 'arr') с реальными ссылками на объекты (например, на все, что arr ссылается).

В общем, все именахранятся в каком-то пространстве имен.Основными типами являются пространства имен объектов, которые являются относительно постоянными и работают либо через __dict__, либо через дескрипторы (например, __slots__), и локальные пространства имен функций, которые существуют только во время работы функции.Модули и классы обычно являются объектами с важными пространствами имен.Существуют правила для разрешения имени, когда оно не найдено в локальном пространстве имен.Общим названием этих правил является аббревиатура LEGB.

CPython выполняет то, что называется подсчетом ссылок, чтобы знать, когда освобождать память.Когда больше нет ссылок на объект, он получает мусор и в конечном итоге удаляется.Поскольку это деталь реализации конкретного интерпретатора, технически объект может жить в памяти без каких-либо допустимых ссылок на него (по крайней мере, не доступных пользователю, без каких-либо ссылок вообще, вы могли бы закончитьс утечкой памяти).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...