本篇内容主要讲解“Python的id()结果怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python的id()结果怎么理解”吧!
曾经有同学问我 id 函数的问题,为什么同样的列表内容 id 值却不一样,而写了一样的数字 id 值也一样,有时候就又不一样了?
In [51]: a = [1,2,3]
In [52]: b=[1,2,3]
In [53]: id(a)
Out[53]: 140424256381640
In [54]: id(b)
Out[54]: 140424256004872
In [55]: a=1
In [56]: b=1
In [57]: id(a), id(b)
Out[57]: (4454569376, 4454569376)
In [58]: a=1000
In [59]: b=1000
In [60]: id(a), id(b)
Out[60]: (140424243121552, 140424243118928)
其实关于这个问题,官方文档的常见问答里给过一段解释:
id() 返回一个整数,该整数在对象的生命周期内保证是唯一的。因为在 CPython 中,这是对象的内存地址,所以经常发生在从内存中删除对象之后,下一个新创建的对象被分配在内存中的相同位置。这个例子说明了这一点:
>>>id(1000)
13901272
>>>id(2000)
13901272
这两个 id 属于之前创建的不同整数对象,并在执行 id() 调用后立即删除。要确保要检查其 id 的对象仍处于活动状态,请创建对该对象的另一个引用:
>>>a = 1000; b = 2000
>>>id(a)
13901272
>>>id(b)
13891296
这里通过内存与对象的关系解决了一部分问题,我们最上面的问题还没有完全解决,下面请看 DE8UG 的进一步解释。
不管是字符串,数字,列表等等其他对象,最终所有数据都要在内存里有自己的位置的。一般来说,我们只需要知道内存地址就能取到具体数据了,也就是 id 后面自己处理的内存问题,直观看就是不同数据对象的 id 的值不一样了。有一点不一样的是,python 底层 c 语言代码对一定数字范围的地址做了缓存,这个范围内看到的 id 值一样,参考:https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong:
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object.
简单翻译就是:在-5 到 256 这个范围内的整数,会直接引用已经存在的对象,所以地址相同。
下面我们分别用两个临界值做一个测试:
In [62]: a=-5
In [63]: b=-5
In [64]: id(a), id(b)
Out[64]: (4454569184, 4454569184)
In [65]: b=-6
In [66]: a=-6
In [67]: id(a), id(b)
Out[67]: (140424243121904, 140424243121552)
In [68]: a=256
In [69]: b=256
In [70]: id(a), id(b)
Out[70]: (4454577536, 4454577536)
In [71]: a=257
In [72]: b=257
In [73]: id(a), id(b)
Out[73]: (140424253951760, 140424253950320)
到此,相信大家对“Python的id()结果怎么理解”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/219853.html