栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

id()与`is`运算符。比较`id`是否安全?相同的id是否代表相同的对象?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

id()与`is`运算符。比较`id`是否安全?相同的id是否代表相同的对象?

根据

id()
文档,
id
只能保证an是唯一的

  1. 在特定对象的生命周期内,以及
  2. 在特定的解释器实例中

因此,
比较

id
s是不安全的,除非您还以某种方式确保在比较时两个
id
被s占用的对象仍然处于活动状态
(并且与同一Python解释器实例相关联,但是您需要真正尝试使其变为false)
)。

正是这样

is
做的-
这使得比较
id
s是多余的。如果您
is
由于某种原因而无法使用语法,那么总会有
operator.is_


现在, 一个物体是否还活着,在比较时并不总是显而易见的 (有时是极 -obvious):

  • **每次 访问某些属性 (例如,对象的绑定方法) 都会创建一个新对象。 因此,
    id
    每个属性访问的结果可能相同也可能不同。

例:

    >>> class C(object): pass>>> c=C()>>> c.a=1>>> c.a is c.aTrue        # same object each time>>> c.__init__ is c.__init__False       # a different object each time# The above two are not the only possible cases.# An attribute may be implemented to sometimes return the same object# and sometimes a different one:@propertydef page(self):    if check_for_new_version():        self._page=get_new_version()    return self._page
  • 如果对象 是由于计算表达式而创建的,并且没有保存在任何地方,则将其立即丢弃 1,之后创建的任何对象都将占用它的

    id

    • 在同一代码行中甚至是这样。例如,结果
      id(create_foo()) == id(create_bar())
      不确定。

例:

 >>> id([])     #the list object is discarded when id() returns    39733320L    >>> id([])     #a new, unrelated object is created (and discarded, too)    39733320L      #its id can happen to be the same    >>> id([[]])    39733640L      #or not    >>> id([])    39733640L      #you never really know

由于比较

id
s时的上述安全性要求,因此用a
id
代替对象不是很有用,因为无论如何您都必须保存对对象本身的引用-
以确保它保持活动状态。也没有任何性能提升:
is
实现就像比较指针一样简单。


最后,作为内部优化(和实现细节,因此实现和发行版之间可能会有所不同),CPython重用了一些经常使用的不可变类型的简单对象。在撰写本文时,其中包括小整数和一些字符串。因此,即使您从不同的地方获得它们,它们的

id
s也会重合。

这(在技术上)没有违反上述

id()
文档的唯一性保证:重用的对象在所有重用中都保持活动状态。

这也不是什么大问题,因为两个变量是否指向同一个对象只知道该对象是否可变:如果两个变量指向同一个可变对象,那么改变一个变量(意外地)也会改变另一个变量。不可变类型没有这个问题,因此对于它们来说,两个变量指向两个相同的对象还是指向同一对象都没有关系。


1有时,这称为“未命名表达式”。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/393681.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号