所以我在python中尝试了一些事情,碰巧碰到了这个:
>>> a = 10
>>> b = 10
>>> a is b
True
显然在创建变量b
时,Python注意到已经有另一个(不同的)变量值为10并且只是创建了对它的引用(可能只是为了节省内存?)。由于整数是不可变的(至少我认为它们是),因此它具有某种意义。
但后来我用更大的数字尝试了同样的事情,并得到了这个:
>>> a = 100200103847239642631982367
>>> b = 100200103847239642631982367
>>> a is b
False
在这里,出于某种原因,Python似乎创建了另一个int
对象而不是使变量b
成为对变量a
的引用,这对我来说没有意义。假设在第一个例子中创建的引用是为了节省内存,在后一种情况下创建引用会不会更有效,因为数字更大?
答案 0 :(得分:3)
Python通常会在-5到256之间缓存整数(尽管实现之间可能会有所不同);当两个名称指向相同的缓存整数时,它们具有相同的id,因此指向同一个对象:
>>> c = 10
>>> d = 10
>>> id(c) == id(d)
True
>>> c is d
True
然而,一旦违反缓存阈值,ID就会发生变化:
>>> e = 256
>>> d = 256
>>> id(e) == id(d)
True
>>> d = 257
>>> e = 257
>>> id(d) == id(e)
False
>>> d is e
False
>>> f = -5
>>> g = -5
>>> id(f) == id(g)
True
>>> f = -6
>>> g = -6
>>> id(f) == id(g)
False
你看到同样的效果。
请注意,is
不会比较值,当您的意思是“等于”时,请不要使用is
:
>>> 10 * 1000 is 10000
False
>>> 10 * 1000 == 10000
True