当前位置: 首页 > 面试题库 >

Python 2.7中的id函数,is运算符,对象标识和用户定义的方法

沈弘盛
2023-03-14
问题内容

以下来自Python
2.7的代码的结果使我感到矛盾。该is运营商应该与对象的身份工作,所以是id。但是,当我查看用户定义的方法时,它们的结果有所不同。这是为什么?

py-mach >>class Hello(object):
...  def hello():
...    pass
...
py-mach >>Hello.hello is Hello.hello
False
py-mach >>id(Hello.hello) - id(Hello.hello)
0

我从Python数据模型的描述中发现以下摘录有些有用。但这并没有真正使一切变得清晰。id如果每次都重新构造用户定义的方法对象,函数为何返回相同的整数?

如果某个类的属性是用户定义的函数对象,未绑定的用户定义的方法对象或类方法对象,则在获取类的属性时(可能通过该类的实例)可以创建用户定义的方法对象。当属性是用户定义的方法对象时,仅当要从中检索该属性的类与原始方法对象中存储的类相同或派生出类时,才创建新的方法对象;否则,将按原样使用原始方法对象。


问题答案:

id函数的Python文档指出:

返回对象的“身份”。这是一个整数(或长整数),在此对象的生存期内,此整数保证是唯一且恒定的。
具有不重叠生存期的两个对象可能具有相同的id()值。

(强调我的)

当您这样做时id(Hello.hello) == id(Hello.hello),方法对象只是短暂地创建,并且在首次调用“
id”之后被视为“无效”。由于调用id,您只需要Hello.hello在短时间内存活-
足以获取ID。一旦获得该ID,该对象将失效,第二个对象Hello.hello可以重用该地址,这使其看起来好像两个对象具有相同的ID。

Hello.hello is Hello.hello与之形成对比的是,两个实例的生存期必须足够长才能相互比较,因此最终您将拥有两个实时实例。

如果您改为尝试:

>>> a = Hello.hello
>>> b = Hello.hello
>>> id(a) == id(b)
False

…您将获得的期望值False



 类似资料:
  • 问题内容: 操作员如何确定两个对象是否相同?它是如何工作的?我找不到记录。 问题答案: 从文档中: 每个对象都有一个标识,一个类型和一个值。一旦创建了对象,其身份就永远不会改变。您可能会认为它是对象在内存中的地址。“ is”运算符比较两个对象的身份;id()函数返回一个表示其身份的整数(当前实现为其地址)。 这似乎表明它在比较参数的内存地址,尽管它说“您可能将其视为对象在内存中的地址”这一事实可能

  • 问题内容: 在实践中我可以在多大程度上依赖对象及其唯一性?例如: 是否意味着反之亦然?那相反呢? 保存某个地方以后使用(例如,放入某个注册表而不是对象本身)有多安全? (作为针对Python规范的建议规范编写:是具有相同id()相同对象的对象,是is运算符,未绑定方法对象) 问题答案: 根据文档,只能保证an是唯一的 在特定对象的生命周期内,以及 在特定的解释器实例中 因此, 比较s是不安全的,除

  • 问题内容: 为什么以下代码在Python中表现异常? 我正在使用Python 2.5.2。尝试使用某些不同版本的Python,Python 2.3.3似乎在99到100之间显示了上述行为。 基于以上所述,我可以假设Python是内部实现的,因此“小”整数的存储方式与大整数的存储方式不同,并且is运算符可以分辨出这种差异。为什么要泄漏抽象?当我事先不知道它们是否为数字时,比较两个任意对象以查看它们是

  • 问题内容: 我需要做一些实验,并且需要知道javascript中对象的某种唯一标识符,因此我可以查看它们是否相同。我不想使用相等运算符,我需要类似python中的id()函数的功能。 是否存在这样的东西? 问题答案: 更新 我下面的原始答案写在6年前,其风格与时代和我的理解相吻合。为了回应评论中的某些对话,一种更现代的方法如下: 如果您对旧版浏览器有要求,请在此处查看的浏览器兼容性。 原始答案保留

  • 我正在测试Cassandra中的UDF/UDA特性,看起来不错。但我在使用它时没有什么问题。 1) 在卡桑德拉。yaml,有人提到启用沙箱是为了避免邪恶代码,那么我们是否违反了规则,启用此支持(标志)会产生什么后果? 2)与在客户端读取数据和编写聚合逻辑相比,在Cassandra中使用UDF/UDA有什么优势? 3)此外,除了JAVA之外,是否有一种语言支持可用于编写UDF/UDA的nodejs、

  • 首先,我想问为什么默认三向运算符的行为不同于用户定义运算符? 其次,这个问题的解决方案对于类是正确的,还是应该以不同的方式处理? 这只是一个简单的例子,我想到了更复杂的情况,有几十个字段和联合(如果您不知道我的意思,请查看一些Intel API;))。 我稍微修改了示例中的类,以便更多地描述实际生活中的问题(当默认运算符不是有效的解决方案时)。我还想澄清,我想知道这些差异背后的原因(用户定义和默认