【问题标题】:memory allocation in python [duplicate]python中的内存分配[重复]
【发布时间】:2015-11-17 11:09:00
【问题描述】:

在 Python 中内存分配是如何发生的?

>>> a=1
>>> b=1
>>> id(a)
2011353552
>>> id(b)
2011353552
>>> b+=1
>>> id(b)

这里,id(a) 等于 id(b)。当我增加 b id(b) 的值时。有人可以对此有所了解吗?

【问题讨论】:

    标签: python-3.x dynamic-memory-allocation


    【解决方案1】:

    这是因为在 python 中一切都是一个对象,小整数是从-5256 的单例并且被缓存这就是为什么id(a) == id(b) 现在当你做b += 1 你重新分配bb + 1这不是增量。如您所见,ab 在第一种情况下指向同一个对象,但随后您重新分配 b 它指向不同的对象。

    >>> a = 1
    >>> b = 1
    >>> a is b
    True
    >>> b += 1
    >>> a is b
    False
    

    【讨论】:

      【解决方案2】:

      这个问题有一些误解,所以我只是给你一些事实,希望对你有所帮助:

      1. 由于数字对象是不可变的,它们可能指向同一个内存。具体来说,来自源的1 可以(但不必)始终是同一个对象。

      2. 您并没有真正增加b 的值以保证技术上正确。您创建一个表示2 的新对象(或获取现有对象)并将其分配给b 变量。它现在是一个新对象。

      3. id() 用于对象的唯一标识符。它根本不必与内存分配有关。目前确实如此,因为cPython 以这种方式使用它。但正如文档所述:

      返回对象的“身份”。这是一个整数(或长整数),保证此对象在其生命周期内是唯一且恒定的。

      仅此而已-仅此而已。这里有多项优化,所以我不希望id() 有任何合理的行为。

      【讨论】:

      • 我不明白 CPython 会根据使用频率来预先分配小整数。
      • 是的,我相信最多 256 个。但这是 cpython 特有的。
      猜你喜欢
      • 2014-01-06
      • 2016-10-08
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 2012-12-13
      • 2012-12-23
      相关资源
      最近更新 更多