我写这篇文章是为了加深对指针
和内存寻址
在python
中工作方式的理解。
Python 是一种高级语言,我了解到内存管理是由 python 负责的。
我还了解到可以使用 id()
对象来标识指针。
假设我有两个变量a
和b
,这两个变量可以使用以下命令交换:
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是不同的。这两个操作如何在低级别发生。
一旦已经分配的指针不再使用,它将如何重用?如果内存地址
不能在给定程序中重用,并且必须为每个新操作(在同一程序中)给出新的内存地址
,那么它是使用高深度的递归
时内存溢出的原因是什么?
我希望我已经清楚地表达了我的问题。
如果我的理解有错误的地方,请指正。来自机械工程背景,虽然我已经编程很长一段时间了,但这件事对我来说真的很困惑。
问候
最佳答案
要理解正在发生的事情,一个简单的心理模型是
每个Python变量都是一个指针。
即使在Python内部的i=1
之后,i
也是一个指向包含值1的对象的指针。即使整数也是普通对象(这在其他语言中并不常见)通常变量最终会直接包含小整数的值)。出于效率原因,某些不可变对象(immutable对象)会被缓存和共享。
小整数会被缓存,因此在 Python 程序中,如果所有值为0
的变量都将是指向同一对象的指针。 在第二种情况下,您观察到不同的id
,因为值不同(i
将指向 1,j
将指向 2 ).
请注意,共享仅针对不可变对象进行,因为除非使用id
,否则无法在代码中观察到共享。在 Python 中,这是针对小数字和一些小字符串(最终被“保留”的字符串)完成的。
关于python - 了解 Python 中的内存寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62588690/