/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存储在内存中的多个位置吗?为什么或者为什么不?
答案 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