所以我在Python 2.7中遇到了一个有趣的行为,我很想知道它为什么会发生。我在python 2.7中定义了以下4个数据结构:
在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)的
答案 0 :(得分:1)
Python使用很多的微小和临时对象(尤其是dict
s,用于传递参数,存储属性等)。为了减少每次创建或销毁此类对象时分配和释放内存的开销,CPython通过为各种大小的小对象预先分配内存插槽数组来进行优化。
因此,当您创建一个小对象时,Python不会按照您期望的方式分配内存。而是使用自己的启发式方法来选择已经预留的一个内存位置。只有在预先分配的小块的“竞技场”的相关部分已满时,才会分配新内存。