在单元测试的上下文中,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() 相同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

徒手搭建Python单元测试框架

使用 Web 套接字的 Tornado 单元测试 - 堆栈上下文呢?

Python-关键字

使用doctest单元测试方式培训讲解:Python函数基础

ModelForm is_valid() 在单元测试期间总是返回 false

spring boot单元测试spring context重复加载问题