【问题标题】:References and copies in python [duplicate]python中的引用和副本[重复]
【发布时间】:2014-12-04 11:13:36
【问题描述】:

所以我在 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 variables reference


    【解决方案1】:

    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
    

    【讨论】:

    • 我正在阅读试图理解这种行为的文档,但找不到它如何缓存小数据。谢谢你的澄清!!
    • 感谢您的回答,但为什么缓存的限制是 -5 和 256?数字越大,缓存不是越有意义吗?
    • @Parzival 缓存的重点是那些在代码中频繁出现(例如作为文字)的数字;尽管理论上缓存更大的数字可以节省更多的内存,但它们的出现频率并不高,不值得。另一方面,缓存您的 0s 和 -1s...
    猜你喜欢
    • 2019-11-16
    • 2017-07-03
    • 1970-01-01
    • 2011-08-16
    • 2019-10-10
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多