在单元测试的上下文中,python 关键字“is”是不是与函数 id() 相同? [复制]
Posted
技术标签:
【中文标题】在单元测试的上下文中,python 关键字“is”是不是与函数 id() 相同? [复制]【英文标题】: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 将这两者放在一起是问答恕我直言。
【参考方案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”,因为您不知道它是否适用于其他实现或未来的实现。以上是关于在单元测试的上下文中,python 关键字“is”是不是与函数 id() 相同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Web 套接字的 Tornado 单元测试 - 堆栈上下文呢?
使用doctest单元测试方式培训讲解:Python函数基础