2016-07-05 161 views
4

在下面的python脚本中,为什么第二个断言会通过(即,将0添加到257并将结果存储在y中,那么x和y会变成不同的对象)?谢谢!Python整数高速缓存

x = 257 
y = 257 
assert x is y 

x = 257    
y = 257 + 0 
assert x is not y 
+0

不使用'is'来检查是否相等...基本上是...它是通过内存位置变量... python prestores少量常量将会ju st在某些情况下正常工作... –

+0

检查此答案;它解释了为什么'是'似乎有时奇怪地工作! http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python –

回答

1

整数都是非可变的,因此任何操作来改变它们产生新的存储位置

>>> a =9876 
>>> id(a) 
38478552 
>>> a+=1 
>>> id(a) 
38478576 
>>> a+=0 
>>> id(a) 
38478528 

is被检查对象的实际存储位置......而且应该基本上都不来检查值是否相等(尽管它可以任意处理一些小的子集)

1

当您使用is,要检查两个对象是否指向同一个内存位置。如果他们这样做,那么结果是真的。否则,结果是False。

要检查这些值是否相等,请使用==,例如, assert x == y。 或者,要声明它们不相等,请使用!=,例如, assert x != y

x = 257 
y = 257 


>>> id(x) 
4576991320 

>>> id(y) 
4542900688 

>>> x is y 
False 

x = 257 
y = 257 + 0 

>>> id(x) 
4576991368 

>>> id(y) 
4576991536