Ответ 1
Прежде всего, прочитайте это более внимательно, особенно последний абзац, http://docs.python.org/extending/extending.html#ownership-rules
Легкий способ думать об этом - это думать о подсчетах ссылок.
-
Ваше первое утверждение верно. Если вы создаете новый объект Python (скажем
PyLong
), то у него уже есть счетчик ссылок 1. Это нормально, если вы собираетесь его вернуть, но если вы не собираетесь его возвращать, он должен быть мусором собранный Python, и он помечен только для GC с refcount = 0, поэтому вам нужно DECREF, если вы не собираетесь его возвращать. -
Второе утверждение ложно. Если вам нужно вернуть его, и вы его создали, просто верните его. Возврат права собственности. Если вы вернулись к INCREF перед возвратом, то вы говорите Python, что вы также сохраняете копию. Итак, если вы создали его, refcount = 1. Если вы затем выполните INCREF, то refcount = 2. Но это не то, что вы хотите, вы хотите вернуться с refcount = 1.
-
Я не совсем уверен, что получаю это, но это скорее вопрос, связанный с C. Как вы добавляете
int
илиdouble
к объекту Python? -
Можете ли вы привести пример, где этот метод не будет работать?
-
Опять же, я не уверен, когда тип C является атрибутом объекта Python. Каждый
int
,double
,long
и т.д. Каким-то образом обертывается объектом Python.
Оговорки к этим ответам изложены в ссылке выше. После этого вы действительно не должны нуждаться в моем плохом объяснении. Надеюсь, я разъяснил и больше не путаю.