Python

참조 횟수

이 섹션의 함수와 매크로는 파이썬 객체의 참조 횟수를 관리하는 데 사용됩니다.

Py_ssize_t Py_REFCNT(PyObject *o)
상의 안정 ABI 버전 3.14 이후로.

파이썬 객체 o 의 참조 횟수를 가져옵니다.

반환된 값이 객체에 실제로 얼마나 많은 참조가 유지되고 있는지 정확하게 반영하지 않을 수 있음에 유의하십시오. 예를 들어, 일부 객체는 :term:`불멸 <immortal>`이며 실제 참조 개수를 반영하지 않는 매우 높은 refcount를 가질 수 있습니다. 결과적으로, 0 또는 1의 값 외에는 반환 값에 의존하지 마십시오.

:c:func:`Py_SET_REFCNT() 함수를 사용하여 객체의 참조 횟수를 설정합니다.

참고

Python의 free-threaded builds 에서 1을 반환하는 것은 o 가 다른 스레드에 의해 접근되지 않는다고 판단하기에 충분하지 않습니다. 대신 PyUnstable_Object_IsUniquelyReferenced() 를 사용하십시오.

또한 PyUnstable_Object_IsUniqueReferencedTemporary() 함수를 참조하십시오.

버전 3.10에서 변경: `:c:func:`Py_REFCNT()`가 인라인 정적 함수로 변경됩니다.

버전 3.11에서 변경: 매개변수 타입은 더 이상 :c:expr:`const PyObject*`가 아닙니다.

void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt)

객체 o 의 참조 카운트를 refcnt 로 설정합니다.

Python build with Free Threading 상태가 됩니다.

이 함수는 불멸 객체에는 영향을 주지 않습니다.

Added in version 3.9.

버전 3.12에서 변경: 불멸 객체는 수정되지 않습니다.

void Py_INCREF(PyObject *o)

Indicate taking a new strong reference to object o, indicating it is in use and should not be destroyed.

이 함수는 불멸 객체에는 영향을 주지 않습니다.

This function is usually used to convert a borrowed reference to a strong reference in-place. The Py_NewRef() function can be used to create a new strong reference.

객체 사용을 마쳤을 때, 해제는 :c:func:`Py_DECREF`를 호출하여 수행합니다.

객체는 NULL 일 수 없습니다; NULL이 아닌지 확실하지 않으면, Py_XINCREF()를 사용하십시오.

이 함수가 o 를 실제로 어떤 방식으로든 수정할 것으로 예상하지 마십시오. 적어도 some objects 의 경우, 이 함수는 아무런 영향을 미치지 않습니다.

버전 3.12에서 변경: 불멸 객체는 수정되지 않습니다.

void Py_XINCREF(PyObject *o)

Py_INCREF() 와 유사하지만, 객체 oNULL 일 수 있으며, 이 경우에는 아무런 영향을 미치지 않습니다.

또한 :c:func:`Py_XNewRef`를 참조하십시오.

PyObject *Py_NewRef(PyObject *o)
상의 안정 ABI 버전 3.10 이후로.

Create a new strong reference to an object: call Py_INCREF() on o and return the object o.

When the strong reference is no longer needed, Py_DECREF() should be called on it to release the reference.

객체 oNULL 일 수 없습니다; oNULL 일 수 있다면 Py_XNewRef() \를 사용하십시오.

예를 들어:

Py_INCREF(obj);
self->attr = obj;

는 다음과 같이 작성할 수 있습니다:

self->attr = Py_NewRef(obj);

또한 Py_INCREF()\도 참조하세요.

Added in version 3.10.

PyObject *Py_XNewRef(PyObject *o)
상의 안정 ABI 버전 3.10 이후로.

Py_NewRef() \와 비슷하지만, 객체 o 는 NULL일 수 있습니다.

객체 oNULL 이면, 함수는 그냥 NULL 을 반환합니다.

Added in version 3.10.

void Py_DECREF(PyObject *o)

더 이상 사용되지 않는다는 것을 나타내며, 객체 o 에 대한 강한 참조 \를 해제합니다.

이 함수는 불멸 객체에는 영향을 주지 않습니다.

마지막 강한 참조가 해제되면 (즉 객체의 참조 횟수가 0이 되면), 객체 형의 할당 해제 함수 (반드시 NULL이 아니어야 합니다)가 호출됩니다.

이 함수는 일반적으로 스코프를 벗어나기 전에 강한 참조\를 삭제하는 데 사용됩니다.

객체는 NULL 일 수 없습니다; NULL이 아닌지 확실하지 않으면, Py_XDECREF()를 사용하십시오.

이 함수가 o 를 실제로 어떤 방식으로든 수정할 것이라고 기대하지 마십시오. 적어도 일부 객체 에 대해서는 이 함수가 효과가 없습니다.

경고

할당 해제 함수는 임의의 파이썬 코드가 호출되도록 할 수 있습니다 (예를 들어, __del__() 메서드가 있는 클래스 인스턴스가 할당 해제될 때). 이러한 코드에서의 예외는 전파되지 않지만, 실행된 코드는 모든 파이썬 전역 변수에 자유롭게 액세스할 수 있습니다. 이것은 Py_DECREF()가 호출되기 전에 전역 변수에서 도달할 수 있는 모든 객체가 일관성 있는 상태에 있어야 함을 뜻합니다. 예를 들어, 리스트에서 객체를 삭제하는 코드는 삭제된 객체에 대한 참조를 임시 변수에 복사하고, 리스트 데이터 구조를 갱신한 다음, 임시 변수에 대해 Py_DECREF()를 호출해야 합니다.

버전 3.12에서 변경: 불멸 객체는 수정되지 않습니다.

void Py_XDECREF(PyObject *o)

Py_DECREF() \와 비슷하지만, 객체 oNULL 일 수 있으며, 이 경우 아무런 효과가 없습니다. Py_DECREF() \에서 온 동일한 경고가 여기에도 적용됩니다.

void Py_CLEAR(PyObject *o)

객체 o에 대한 강한 참조를 해제합니다. 객체는 NULL 일 수 있습니다, 이때 매크로는 효과가 없습니다; 그렇지 않으면 인자도 NULL로 설정된다는 점을 제외하고는, 효과가 Py_DECREF()와 같습니다. 매크로가 임시 변수를 신중하게 사용하고, 참조를 해제하기 전에 인자를 NULL로 설정하기 때문에, Py_DECREF()에 대한 경고는 전달된 객체와 관련하여 적용되지 않습니다.

가비지 수집 중에 탐색 될 수 있는 객체에 대한 참조를 해제할 때마다 이 매크로를 사용하는 것이 좋습니다.

버전 3.12에서 변경: 매크로 인수는 이제 한 번만 평가됩니다. 인수에 부수 효과가 있는 경우, 더 이상 중복되지 않습니다.

void Py_IncRef(PyObject *o)
상의 안정 ABI.

객체 o 에 대한 새 강한 참조 \를 취함을 나타냅니다. Py_XINCREF() \의 함수 버전입니다. 이는 파이썬의 런타임 동적 내장용으로 사용될 수 있습니다.

void Py_DecRef(PyObject *o)
상의 안정 ABI.

객체 o 에 대한 강한 참조 \를 해제합니다. Py_XDECREF() \의 함수 버전입니다. 이는 파이썬의 런타임 동적 내장용으로 사용될 수 있습니다.

Py_SETREF(dst, src)

매크로가 객체 dst 에 대한 강한 참조 \를 안전하게 해제하고 dstsrc 로 설정합니다.

Py_CLEAR()\의 경우와 마찬가지로, “명백한” 코드는 치명적일 수 있습니다:

Py_DECREF(dst);
dst = src;

안전한 방법은 다음과 같습니다:

Py_SETREF(dst, src);

이는 dst 의 이전 값에 대한 참조를 해제하기 전에 dstsrc 로 설정하도록 배열하여, dst 가 제거되는 부수 효과로 트리거되는 코드가 더 이상 dst 가 유효한 객체를 가리킨다고 믿지 않게 합니다.

Added in version 3.6.

버전 3.12에서 변경: 매크로 인수는 이제 한 번만 평가됩니다. 인수에 부수 효과가 있는 경우, 더 이상 중복되지 않습니다.

Py_XSETREF(dst, src)

Py_SETREF\ 매크로의 변형으로 Py_DECREF()\ 대신 Py_XDECREF()\를 사용합니다.

Added in version 3.6.

버전 3.12에서 변경: 매크로 인수는 이제 한 번만 평가됩니다. 인수에 부수 효과가 있는 경우, 더 이상 중복되지 않습니다.