我知道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!
答案 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 x
和id(x) == id(x)
方法对于所有文字类型并不总是相同的
在这个问题的具体情况下,他们可能被视为平等。