참조 횟수¶
이 섹션의 함수와 매크로는 파이썬 객체의 참조 횟수를 관리하는 데 사용됩니다.
-
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.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()와 유사하지만, 객체 o 가NULL일 수 있으며, 이 경우에는 아무런 영향을 미치지 않습니다.또한 :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.객체 o 는
NULL일 수 없습니다; o 가NULL일 수 있다면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일 수 있습니다.객체 o 가
NULL이면, 함수는 그냥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()\와 비슷하지만, 객체 o 는NULL일 수 있으며, 이 경우 아무런 효과가 없습니다.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 에 대한 강한 참조 \를 안전하게 해제하고 dst 를 src 로 설정합니다.
Py_CLEAR()\의 경우와 마찬가지로, “명백한” 코드는 치명적일 수 있습니다:Py_DECREF(dst); dst = src;
안전한 방법은 다음과 같습니다:
Py_SETREF(dst, src);
이는 dst 의 이전 값에 대한 참조를 해제하기 전에 dst 를 src 로 설정하도록 배열하여, 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에서 변경: 매크로 인수는 이제 한 번만 평가됩니다. 인수에 부수 효과가 있는 경우, 더 이상 중복되지 않습니다.