这个问题已经在这里有了答案: > “is” operator behaves unexpectedly with integers 10个
所以我一直在尝试用python做一些事情,碰巧遇到了这个问题:
>>> a = 10
>>> b = 10
>>> a is b
True
显然,在创建变量b时,Python注意到已经存在另一个(不同的)变量,其值为10,并简单地创建了对其的引用(可能只是为了节省内存?).由于整数是不可变的(至少我认为它们是不变的),所以它具有某种意义.
但是后来我尝试了更多的相同事情,并得到了:
>>> a = 100200103847239642631982367
>>> b = 100200103847239642631982367
>>> a is b
False
在这里,由于某种原因,Python似乎创建了另一个int对象,而不是使变量b成为对变量a的引用,这对我来说没有意义.假设第一个示例中创建的引用是为了节省内存,那么在后一种情况下创建引用会不会更有效,因为数字更大吗?
解决方法:
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
您会看到相同的效果.
请记住,当您真正表示“等于”时,是不比较值,不使用是:
>>> 10 * 1000 is 10000
False
>>> 10 * 1000 == 10000
True