2016-11-20 3 views
3

Мне интересно, как работает управление памятью/подсчет ссылок, когда новое значение устанавливается в существующее поле внутри PyDict (внутри расширения C).Сводка ссылок с использованием PyDict_SetItemString

Например, предположим, что словарь создается и заполняется следующим образом:

myPyDict = PyDict_New(); 
tempPyObj = PyString_FromString("Original Value"); 
PyDict_SetItemString(myPyDict,"fieldname",tempPyObj); 
Py_DECREF(tempPyObj); 

С счетную точки зрения памяти и эталонным, что происходит, когда существует последующее

tempPyObj = PyString_FromString("New Value"); 
PyDict_SetItemString(myPyDict,"fieldname",tempPyObj); 
Py_DECREF(tempPyObj); 

ли счетчик ссылок для исходного значения автоматически уменьшается (и автоматически освобождается память)?

Док для PyList_SetItem специально упоминает, что происходит в списках: This function “steals” a reference to item and discards a reference to an item already in the list at the affected position.

Но ни PyDic_SetItem, ни PyDict_SetItemString сказать, как замена обрабатывается для словарей.

ответ

2

Счетчик старого значения автоматически уменьшается по логике PyList_SetItem. Вы не должны декрементировать старое значение самостоятельно.

Если вы хотите узнать подробности, посмотрите исходный код CPython, в частности на файл Objects/dictobject.c.

1) PyDict_SetItemString()

https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L3250-L3262

Это это тонкая оболочка вокруг PyDict_SetItem()

2) PyDict_SetItem()

https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1537-L1565

Все еще довольно просто, и очевидно, что весь тяжелый подъем, связанный с вставкой/заменой значений в dict, фактически выполняется insertdict().

3) insertdict()

https://github.com/python/cpython/blob/c8e7c5a/Objects/dictobject.c#L1097-L1186

это функция, которая дает нам ответ. В этой функции вы можете найти ключевой код, и особенно звонок:

Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */ 

, который уменьшает счетчик старого значения.

Смежные вопросы