变量分配存储在内存中的什么位置?

时间:2019-03-06 02:32:43

标签: python python-3.x memory memory-management

/set03/V001/visible/I00875.jpg 333,212,354,254,0
/set03/V001/visible/I00955.jpg 469,224,524,348,0 392,212,424,276,0
/set03/V001/visible/I00773.jpg 343,218,369,263,0 357,216,381,264,0 276,204,296,246,0
/set03/V001/visible/I01236.jpg 229,207,249,233,0
/set03/V001/visible/I00484.jpg 324,191,344,240,0 315,194,337,246,0

在cpython中,两个id命令将返回相同的内存地址,其中存储了整数5,但是在内存中的y 等于 5的信息存储在哪里?

为什么知道内存中存储5的位置很重要,而知道内存y等于5的存储位置为什么不重要呢?

还可以在使用python时将数字5存储在内存中的多个位置吗?为什么或者为什么不?

1 个答案:

答案 0 :(得分:3)

id(y)id(5)表示所讨论的5的存储位置,而不是y本身(名称)的存储位置。

y本身的位置(持有指向代表5的对象的指针的名称)是实现细节;在CPython中,函数本地名称存储在调用函数时创建的数组中,并在函数完成时清除,而全局名称存储在每个模块dict中(可视为globals())。函数的__code__属性包含有关局部变量的信息,但不提供对数组的直接访问(因为这将允许Python代码破坏解释器不变式,或者依赖于实现细节,这些实现细节即使在微发行版之间也可能会发生变化)。

知道5的位置并不是很重要。 id函数无意提供实际位置,这只是分配CPython使用的唯一ID的便捷方法。在像PyPy这样的非CPython解释器中,它实际上根本不需要描述内存地址(它们以其他方式分配唯一的ID,因为垃圾回收意味着内存地址在对象的生存期内不稳定)。 id的重点是关于身份;这是 same 对象的两件事(也可以用is操作符测试),不仅价值相等。

关于您的问题“使用python时是否可以将数字5存储在内存中的多个位置?”,对于CPython的回答为“否”,但是语言规范没有这样的保证。 id(y)id(5)是相同的,只是因为实现细节,即小的int缓存。在CPython上,从int-5(含)的256是单例;不管您如何获得它们(数学,解析字符串,文字等),每种都只有一个。但是对于超出该范围的int,它们是按需创建的,因此,id在大多数情况下不会重叠:

>>> y = 500
>>> id(y)
2538476592176
>>> id(500)
2538471826288