返回介绍

共享引用和相等

发布于 2024-01-29 22:24:17 字数 1349 浏览 0 评论 0 收藏 0

出于完整的考虑,本章前面介绍的垃圾收集的行为与常量相比,某些类型需要更多地思考。参照下边的语句:

因为Python缓存并复用了小的整数和小的字符串,就像前文提到的那样,这里的对象42也许并不像我们所说的被回收;相反地,它将可能仍被保存在一个系统表中,等待下一次你的代码生成另一个42来重复利用。尽管这样,大多数种类的对象都会在不再引用时马上回收;对于那些不会被回收的,缓存机制与代码并没有什么关系。

例如,由于Python的引用模型,在Python程序中有两种不同的方法去检查是否相等。让我们创建一个共享引用来说明:

这里的第一种技术“==操作符”,测试两个被引用的对象是否有相同的值。这种方法往往在Python中用作相等的检查。第二种方法“is操作符”,是在检查对象的同一性。如果两个变量名精确地指向同一个对象,它会返回True,所以这是一种更严格形式的相等测试。

实际上,is只是比较实现引用的指针,所以如果必要的话是代码中检测共享引用的一种办法。如果变量名引用值相等,但是是不同的对象,它的返回值将是False,正如当我们运行两个不同的常量表达式时:

看看当我们对小的数字采用同样的操作时的结果:

在这次交互中,X和Y应该是==的(具有相同的值),但不是is的(同一个对象),因为我们运行了两个不同的常量表达式。不过,因为小的整数和字符串被缓存并复用了,所以is告诉我们X和Y是引用了一个相同的对象。

实际上,如果你确实想刨根问底的话,你能够向Python查询对一个对象引用的次数:在sys模块中的getrefcount函数会返回对象的引用次数。例如,在IDLE GUI中查询整数对象1时,它会报告这个对象有837次重复引用(绝大多数都是IDLE系统代码所使用的):

这种对象缓存和复用的机制与代码是没有关系的(除非你运行这个检查)。因为不能改变数字和字符串,所以无论对同一个对象有多少个引用都没有关系。然而,这种现象也反映了Python为了执行速度而采用的优化其模块的众多方法中的一种。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文