Python对象分配地址

标签 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)。

最佳答案

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

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

关于Python对象分配地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31379265/

相关文章:

python - dbus-python 如何返回字典数组

Python 无法运行 Pyprocessing 脚本

python - 数据框中每组的 Pandas 第二最大值

java - 在 Java 中返回一个对象

javascript - 限制一个对象留在另一个对象内

python - 使用 nargs 参数时,如何使 argparse.ArgumentParser 返回元组或 np.array 而不是列表?

python - 为什么 tf.gradients 不适用于整数常量?

python - 如何在 python 中对整数占位符执行操作?

javascript - 对象中的条件变量

python - GetUserTimeline 总是返回我自己的时间线