Python对象分配地址

时间:2015-07-13 09:02:12

标签: python python-2.7 object memory allocation

所以我在Python 2.7中遇到了一个有趣的行为,我很想知道它为什么会发生。我在python 2.7中定义了以下4个数据结构:

  • 设置为“ st
  • 列表' lst '
  • 元组' tpl '
  • 词典为“ dct

在python中创建它们:

st = set(['apple', 'orange', 'apple', 'pear', 'orange', 'banana']) 
lst = [1, 2, 3, "4"] 
tpl = (1, 2, 3, '4') 
dct = {'one': 1, 'two': 2, 'three': 3};

以下是4个对象的表示:

st.__repr__
<method-wrapper '__repr__' of set object at 0x7f234997ba48>

tpl.__repr__
<method-wrapper '__repr__' of tuple object at 0x7f23499667e0>

lst.__repr__
<method-wrapper '__repr__' of list object at 0x7f2349910b48>

dct.__repr__
<method-wrapper '__repr__' of dict object at 0x25af3a0>

正如您所看到的,与其他人(0x7f23499 *****)相比,我的词典被放置在一个完全不同的内存部分(0x25af3a0)中。

我的问题是,为什么字典对象被放置到完全不同的内存部分?

Python版本是2.7.3(在Linux上用GCC 4.7.2编译),linux版本是3.18.0-kali3-amd64#1 SMP Debian 3.18.6-1~kali2(2015-03-02)x86_64 GNU / Linux)的

1 个答案:

答案 0 :(得分:1)

Python使用很多的微小和临时对象(尤其是dict s,用于传递参数,存储属性等)。为了减少每次创建或销毁此类对象时分配和释放内存的开销,CPython通过为各种大小的小对象预先分配内存插槽数组来进行优化。

因此,当您创建一个小对象时,Python不会按照您期望的方式分配内存。而是使用自己的启发式方法来选择已经预留的一个内存位置。只有在预先分配的小块的“竞技场”的相关部分已满时,才会分配新内存。