2012-04-24 2 views
5

Из того, что я могу сказать, разница между PyList_SetItem и PyList_SETITEM заключается в том, что PyList_SetItem уменьшит количество ссылок на элемент списка, который он перезаписывает, и PyList_SETITEM этого не делает.PyList_SetItem против PyList_SETITEM

Есть ли причина, по которой я не должен просто использовать PyList_SetItem все время? Или я попаду в неприятности, если бы я использовал PyList_SetItem для инициализации позиции индекса в списке?

ответ

6

PyList_SET_ITEM - небезопасный макрос, который в основном вставляет объект во внутренний массив указателей списка без каких-либо проверок границ. Если что-либо не NULL находится в i-й позиции списка, произойдет эталонная утечка. PyList_SET_ITEM крадет ссылку на объект, который вы ввели в список. PyList_SetItem также крадет ссылку, но проверяет границы и декреты на все, что может быть на i-й позиции. Правило большого пальца - это использование PyList_SET_ITEM для инициализации списков, которые вы только что создали, и PyList_SetItem в противном случае. Также полностью безопасно использовать PyList_SetItem; PyList_SET_ITEM - это в основном скорость взлома.

+1

Но буду ли я сталкиваться с какой-либо проблемой, если я использую PyList_SetItem * all * time и * never * использовать PyList_SETITEM? – user1245262

+2

Абсолютно нет. На самом деле, это, наверное, самый безопасный способ. 'PyList_SET_ITEM' - это, в основном, хакер. –

+0

Спасибо, спасибо за добавление прояснения последней строки к вашему оригинальному ответу. – user1245262