Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典变量是如何存储在内存中的?_Python_Dictionary - Fatal编程技术网

Python 字典变量是如何存储在内存中的?

Python 字典变量是如何存储在内存中的?,python,dictionary,Python,Dictionary,谁能解释一下这些python字典是如何列出存储在内存中的变量的。我知道在python中,内存管理是使用堆和堆栈来完成的。但是我真的找不到一个简单的解释来解释创建dictionary变量时如何分配内存,它是在堆栈帧还是在堆空间中创建的?好吧,让我们看看源代码来弄清楚它 发件人: 因此,使用PyObject\u GC\u new() 发件人: 发件人: 发件人: 我认为在这一点上可以安全地假设,这些将调用malloc,calloc,realloc,以及free 在这一点上,这不再是一个python问

谁能解释一下这些python字典是如何列出存储在内存中的变量的。我知道在python中,内存管理是使用堆和堆栈来完成的。但是我真的找不到一个简单的解释来解释创建dictionary变量时如何分配内存,它是在堆栈帧还是在堆空间中创建的?

好吧,让我们看看源代码来弄清楚它

发件人:

因此,使用
PyObject\u GC\u new()

发件人:

发件人:

发件人:

我认为在这一点上可以安全地假设,这些将调用
malloc
calloc
realloc
,以及
free


在这一点上,这不再是一个python问题,但答案是它取决于操作系统是否将
malloc
分配到堆栈或堆上。

检查这一点:内存管理详细信息不属于python的指定方式。内存布局被抽象掉;你也可以问一下电子是如何在你的CPU中流动来创建一个dict的。
static PyObject *
new_dict(PyDictKeysObject *keys, PyObject **values)
{
    PyDictObject *mp;
    ...
        mp = PyObject_GC_New(PyDictObject, &PyDict_Type);
    ...
    return (PyObject *)mp;
}
.. c:function:: TYPE* PyObject_GC_New(TYPE, PyTypeObject *type)

   Analogous to :c:func:`PyObject_New` but for container objects with the
   :const:`Py_TPFLAGS_HAVE_GC` flag set.
PyObject *
_PyObject_New(PyTypeObject *tp)
{
    PyObject *op;
    op = (PyObject *) PyObject_MALLOC(_PyObject_SIZE(tp));
    if (op == NULL)
        return PyErr_NoMemory();
    return PyObject_INIT(op, tp);
}
#define MALLOC_ALLOC {NULL, _PyMem_RawMalloc, _PyMem_RawCalloc, _PyMem_RawRealloc, _PyMem_RawFree}
#ifdef WITH_PYMALLOC
#  define PYMALLOC_ALLOC {NULL, _PyObject_Malloc, _PyObject_Calloc, _PyObject_Realloc, _PyObject_Free}
#endif

#define PYRAW_ALLOC MALLOC_ALLOC
#ifdef WITH_PYMALLOC
#  define PYOBJ_ALLOC PYMALLOC_ALLOC
#else
# define PYOBJ_ALLOC MALLOC_ALLOC
static PyMemAllocatorEx _PyObject = PYOBJ_ALLOC;
...

void *
PyObject_Malloc(size_t size)
{
    /* see PyMem_RawMalloc() */
    if (size > (size_t)PY_SSIZE_T_MAX)
        return NULL;
    return _PyObject.malloc(_PyObject.ctx, size);
}