Python的id()结果怎么理解

本篇内容主要讲解“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

(0)
上一篇 2022年1月2日 13:46
下一篇 2022年1月2日 13:46

相关推荐

发表回复

登录后才能评论