【问题标题】:Is the python keyword "is" the same as the function id(), in the context of unittesting? [duplicate]在单元测试的上下文中,python 关键字“is”是否与函数 id() 相同? [复制]
【发布时间】:2013-03-06 00:05:39
【问题描述】:

我已尝试阅读文档,但无法得到明确的答案。

id(a) == id(b)

一样
a is b

同样是

import unittest
unittest.TestCase.assertNotEqual(id(a), id(b))

因此与

相同
import unittest
unittest.TestCase.assertIsNot(a, b)

【问题讨论】:

  • @Makoto 在那个问题或其答案中很少提及id...(我会说没有,但是两个答案提及它没有解决这个问题)问题是旧的“is 似乎适用于字符串”,这个问题更新颖的是“is 相当于 id() 比较”。
  • @delnan:答案包含is 测试身份和id() 函数returns the identity of an object 的事实。我想说答案中有足够的提及。
  • @Makoto 将这两者放在一起是问答恕我直言。

标签: python unit-testing keyword


【解决方案1】:

是的

CPython 中的

"id" 为您提供所引用对象的内存地址。地址唯一标识同一个python进程中的一个对象。

因此,

id(a) == id(b)

“实例a和b的内存地址是否相同?”相当于 “a 和 b 指的是同一个对象吗?”

a is b

来自“id”的文档字符串:

id(object) -> 整数

返回对象的标识。这保证是唯一的 同时存在的对象。 (提示:这是对象的内存地址。)

【讨论】:

  • PyPy 等非 CPython 实现怎么样?
  • @delnan:至少在 PyPy 中,id(a) == id(b) <-> a is b(ref)
  • @delnan 如果 id(a)==id(b) 在 CPython 中为真,那么在 PyPy 中也为真。相反,情况并非总是如此。试试:(1000000000 + 1) 是 (1000000000+1)。后者在 PyPy 中总是正确的,但在 CPython 中则不然。
  • 太棒了。我没有问是因为我不知道(我什至知道为什么会这样),我问是因为答案可以使用这些信息。
  • 根据第 5.9 节末尾的 Python 语言参考。比较 'is' 运算符测试的对象身份。所以 assertIsNot(a,b) 总是可以用 assertNotEqual(id(a), id(b)) 代替。根据实现的内部机制,当涉及到值类型时,您可能会得到不同的结果,因此当您想要比较值时避免使用“is”,因为您不知道它是否适用于其他实现或未来的实现。
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 2017-11-23
  • 2017-07-29
  • 1970-01-01
  • 2019-08-22
  • 2020-08-20
  • 2019-02-15
  • 2011-03-05
相关资源
最近更新 更多