2013-03-17 17 views
1

我试过阅读文档,但无法得到明确的答案。在单元测试的上下文中,python关键字“is”是否与函数id()相同?

id(a) == id(b) 

相同

a is b 

同样就是

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

因此相同

import unittest 
unittest.TestCase.assertIsNot(a, b) 
+1

@Makoto在这个问题或其答案中提及'id' ...(我会说没有,但两个答案*提及*它没有解决这个问题)这个问题是老问题,“似乎是为字符串工作”,这个问题是更新颖的“是'是'相当于'id()'比较”。 – delnan 2013-03-17 17:03:17

+0

@delnan:答案包含'is'测试身份和'id()'函数[返回对象的身份]的事实(http://docs.python.org/2/library/functions。 HTML#ID0)。我会说在答案中有足够的提及。 – Makoto 2013-03-17 17:09:06

+2

@Makoto把这两个在一起是问题和答案恕我直言。 – delnan 2013-03-17 17:10:29

回答

1

CPython中的“id”为您提供了所引用对象的内存地址。该地址在同一个python进程中唯一标识一个对象。

因此,

id(a) == id(b) 

意思是“的实例A和B的相同内存地址吗?”这相当于 “做a和b是指同一个对象吗?”

a is b 

从 “ID” 的文档字符串:

ID(对象) - >整数

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

+0

非CPython如PyPy的实现如何? – delnan 2013-03-17 17:08:19

+0

@delnan:至少在PyPy中,'id(a)== id(b)<-> a是b' [(ref)](http://pypy.readthedocs.org/en/latest/cpython_differences.html#object -identity-原语值-的是和-ID)。 – DSM 2013-03-17 17:15:51

+0

@delnan如果id(a)== id(b)在CPython中为真,那么它在PyPy中是真的。相反,情况并非总是如此。试试:(1000000000 + 1)是(1000000000 + 1)。后者在PyPy中总是如此,但在CPython中则不然。 – 2013-03-17 17:26:47

相关问题