python中的引用和副本

时间:2014-12-04 11:13:37

标签: python variables reference

所以我在python中尝试了一些事情,碰巧碰到了这个:

>>> a = 10
>>> b = 10
>>> a is b
True

显然在创建变量b时,Python注意到已经有另一个(不同的)变量值为10并且只是创建了对它的引用(可能只是为了节省内存?)。由于整数是不可变的(至少我认为它们是),因此它具有某种意义。 但后来我用更大的数字尝试了同样的事情,并得到了这个:

>>> a = 100200103847239642631982367
>>> b = 100200103847239642631982367
>>> a is b
False

在这里,出于某种原因,Python似乎创建了另一个int对象而不是使变量b成为对变量a的引用,这对我来说没有意义。假设在第一个例子中创建的引用是为了节省内存,在后一种情况下创建引用会不会更有效,因为数字更大?

1 个答案:

答案 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