所以我在 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)。
最佳答案
Python 使用大量微小的临时对象(尤其是dict
,用于传递参数、存储属性等)。为了减少每次创建或销毁此类对象时分配和释放内存的开销,CPython 通过为各种大小的小对象预先分配内存槽数组进行优化。
因此,当您创建一个小对象时,Python 不会按照您期望的方式分配内存。相反,它使用自己的启发式方法来选择已经预留的内存位置之一。仅当 Python 的预分配小块“竞技场”的相关部分已满时,才会分配新内存。
关于Python对象分配地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31379265/