python - arr = [1, 2, 3] 的引用 arr 存储在哪里?

标签 python c pointers

假设这样一个 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 = 0x7ffeeefc97a0arr[]的地址,&ptr1是存储指针或变量本身的位置。

关于Python

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

'0x106065088'是arr值的地址,那么引用“arr”呢,它存储在哪里?

最佳答案

对顶级名称的引用通过模块的 namespace 绑定(bind)。如果您在解释器中运行,则该模块称为 __main__ 。模块通常有 __dict__引用所有顶级名称(如 'arr' )到实际对象引用(如 arr 引用的任何内容)的映射的属性。

一般来说,所有名称都存储在某种命名空间中。基本类型是对象命名空间,它们相对永久,可以通过 __dict__ 工作。或描述符(例如 __slots__ )和函数本地命名空间,仅在函数运行时存在。通常,模块和类是具有重要 namespace 的对象。当在本地命名空间中找不到名称时,有一些规则可以解析该名称。这些规则的通用名称是缩写 LEGB。

CPython 执行称为引用计数的操作来了解何时释放内存。当不再存在对某个对象的引用时,该对象将被垃圾收集并最终被删除。由于这是特定解释器的实现细节,从技术上讲,一个对象可以存在于内存中,而无需任何对其的有效引用(至少用户无法访问,根本没有任何引用,您将最终导致内存泄漏)。

关于python - arr = [1, 2, 3] 的引用 arr 存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52837147/

相关文章:

json - 为什么 json.Unmarshal 在 golang 中追加一个新指针后会更改指针值?

python - 配置 Nginx 仅为一个端点提供服务

c++ - 如何将字符串分配给从数组中间开始的字符数组?

c - 如何将小部件添加到glade文件中?

c++ - 指向未知大小数组的指针是否不完整?

c++ - (C++) 使用指向整数的引用指针初始化字符串变量并打印一些东西?

python - 用列表值反转字典

python - Celery Django 没有注册任务,在 shell 中找不到模块错误

python - Python 3.x 的 SQLite 版本

c - C中的多个文件编译错误