从这个链接我了解到:
当前的实现方式为所有介于-5和256之间的整数保留一个整数对象数组,当您在该范围内创建一个整数时,您实际上只会得到对现有对象的引用。
但是,当我尝试为我的会话提供一些示例时,我发现它在赋值和元组拆包方面的行为不同。
以下是代码片段:
>>> a,b = 300,300
>>> a is b
True
>>> c = 300
>>> d = 300
>>> c is d
False
从这个链接我了解到:
当前的实现方式为所有介于-5和256之间的整数保留一个整数对象数组,当您在该范围内创建一个整数时,您实际上只会得到对现有对象的引用。
但是,当我尝试为我的会话提供一些示例时,我发现它在赋值和元组拆包方面的行为不同。
以下是代码片段:
>>> a,b = 300,300
>>> a is b
True
>>> c = 300
>>> d = 300
>>> c is d
False
a, b = 300, 300
print a is b
c = 300
d = 300
print c is d
is
和is not
并不重要,因为你无法修改它们。 import dis
def testMethod1():
a, b = 300, 300
print dis.dis(testMethod1)
输出:
4 0 LOAD_CONST 2 ((300, 300))
3 UNPACK_SEQUENCE 2
6 STORE_FAST 0 (a)
9 STORE_FAST 1 (b)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE None
def testMethod2():
a = 300
b = 300
打印:
7 0 LOAD_CONST 1 (300)
3 STORE_FAST 0 (a)
8 6 LOAD_CONST 1 (300)
9 STORE_FAST 1 (b)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE None
因此,看起来两种方法基本相同,但第一种方法中有一个步骤使用了LOAD_CONST
,而第二种方法中使用了两个步骤....
编辑
经过一些测试,我发现两种方法最终都会返回False
; 然而,在仅运行一次的情况下(即不将方法放在循环中),它们似乎总是返回True
。有时它使用单个引用,有时它不使用。
文档仅说明-5到256将返回相同的引用;因此,在这种情况下,你根本不应该使用is
进行比较,因为数字的当前id
没有保证。
NB:你永远不应该使用is
来比较值,因为这不是它的作用,它是用来比较标识的。我的观点是,当你超出定义的范围时,is
的返回值并不总是True
。
is
不应该用于“比较”。is
应该用于“身份识别”。比较a和b就像是在说“a等于b吗?”测试身份就像是在问“a和b是同一件事吗?” - Noufal Ibrahimis
的作用。但我所说的是,在这种情况下,你不想使用 is
来进行比较。 - Steve P.
is
的行为未被定义。任何您今天获得的有关某个实现行为的知识都将是脆弱的。 - Paul Hankin