python - 了解 Python 中的内存寻址

标签 python pointers memory-address

我写这篇文章是为了加深对指针内存寻址python中工作方式的理解。

Python 是一种高级语言,我了解到内存管理是由 python 负责的。

我还了解到可以使用 id() 对象来标识指针。

假设我有两个变量ab,这两个变量可以使用以下命令交换:

a,b=b,a

可以使用以下方法找到这些变量的身份变化。

>>> a=2
>>> b=3
>>> id(a)
140732857872688
>>> id(b)
140732857872720
>>> a,b=b,a
>>> a
3
>>> b
2
>>> id(a)
140732857872720
>>> id(b)
140732857872688

正如您所看到的,ids 已交换(如预期),换句话说,我们可以说分配给变量的 ids 已交换。这在Python中是如何发生的?

再举一个例子,

>>> i=0
>>> id(i)
140732857872624
>>> i+=1
>>> id(i)
140732857872656

i 增加 1 时,如何在后台创建具有相同名称的新变量(我称其为新变量,因为身份正在更改)?

我还添加了一个示例来进一步扩展我的问题!

操作1:

>>> i,j=0,0
>>> id(i)
140732857872624
>>> id(j)
140732857872624
>>> i,j = i+1,i+1
>>> i
1
>>> j
1
>>> id(i)
140732857872656
>>> id(j)
140732857872656

操作2:

>>> i,j=0,0
>>> i=i+1
>>> j=i+1
>>> i
1
>>> j
2
>>> id(i)
140732857872656
>>> id(j)
140732857872688

当然操作1和操作2是不同的。这两个操作如何在低级别发生。

一旦已经分配的指针不再使用,它​​将如何重用?如果内存地址不能在给定程序中重用,并且必须为每个新操作(在同一程序中)给出新的内存地址,那么它是使用高深度的递归时内存溢出的原因是什么?

我希望我已经清楚地表达了我的问题。

如果我的理解有错误的地方,请指正。来自机械工程背景,虽然我已经编程很长一段时间了,但这件事对我来说真的很困惑。

问候

最佳答案

要理解正在发生的事情,一个简单的心理模型是

  1. 每个Python变量都是一个指针。
    即使在Python内部的i=1之后,i也是一个指向包含值1的对象的指针。即使整数也是普通对象(这在其他语言中并不常见)通常变量最终会直接包含小整数的值)。

  2. 出于效率原因,某些不可变对象(immutable对象)会被缓存和共享。
    小整数会被缓存,因此在 Python 程序中,如果所有值为 0 的变量都将是指向同一对象的指针。 在第二种情况下,您观察到不同的 id,因为值不同(i 将指向 1,j 将指向 2 ).
    请注意,共享仅针对不可变对象进行,因为除非使用id,否则无法在代码中观察到共享。在 Python 中,这是针对小数字和一些小字符串(最终被“保留”的字符串)完成的。

关于python - 了解 Python 中的内存寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62588690/

相关文章:

python - "Bin labels must be one fewer than the number of bin edges"通过 pd.qcut 重复后 = 'drop' kwarg

python - 在python中更改命令行变量值

python - 过滤掉pandas数据框中的重复数据

c - 如何将地址 int 转换为 char * 字符串

c++ - 在 C++ 中使用它在内存中的起始地址编辑字符串

Python 3 + Selenium : Clicked the element but nothing happen

c++ - 从指针 vector 的 vector 中释放内存

c++ - 用于类似区域/竞技场分配的 STL 容器

c++ - 为什么 std::unique_ptr 比标准指针慢得多……在优化之前?

c - C 中的指针和数组引用