为什么id(1)是id(1)返回False?

时间:2015-09-14 21:00:59

标签: python object comparison

我知道is运算符会比较两者的id,而不是值
但是,当您评估id(1)和id(1)时,对象(它是一个int)彼此相等。

那么为什么它会返回假?

id(1) # 27533656
id(1) is id(1) # False
type(id(1)) # int

然后,从技术上讲,将其推断为

id(1) is id(1)
27533656 is 27533656 # has to be True!

2 个答案:

答案 0 :(得分:6)

is检查对象身份,而==检查对象相等。差异可能很微妙,但在处理像列表这样的可变对象时最容易看到:

x = [1, 2, 3]
y = x[:]  # copy, not the same list
x is y  # False
x == y  # True

如果我向x添加内容,y将无法看到它:

x.append(4)
x == y  # now False since they have diverged.

但是,如果我将x别名并附加到其中,别名也会看到更改:

z = x  # alias `z` to `x`
x.append(5)
x == z  # True

原因是z x

z is x  # True

在这种情况下,id的{​​{1}}是一致的,因为CPython 1 缓存小整数以提高效率(因此对象文字1始终是相同的对象 - 因此相同的Id)。但是,1的返回值实际上可能是具有等效值的id的不同实例。

1 这是CPython的一个众所周知的实现细节。其他实现(和未来版本)的行为是不同的,所以不要依赖这种行为。

答案 1 :(得分:4)

您轻微误解了is语法的作用。

你正在使用的那段代码大致是:

id(id(1)) == id(id(1))

因为id函数返回的值不是静态的,并且不能保证是相同的标识,所以它们很可能是不同的标识。

作为证明,当我把它们放入打印声明时,我得到:

print id(id(1)) # 4327028
print id(id(1)) # 4326968

这显然不一样。

如果您要将代码更改为:

if 1 is 1: # basically in this case id(1) == id(1)
    print "success"

您会发现这些值确实是相同的ID。

如评论中所述。确定等价的x is xid(x) == id(x)方法对于所有文字类型并不总是相同的 在这个问题的具体情况下,他们可能被视为平等。