참조 횟수¶
이 섹션의 함수와 매크로는 파이썬 객체의 참조 횟수를 관리하는 데 사용됩니다.
-
Py_ssize_t Py_REFCNT(PyObject *o)¶
- …의 일부 안정 ABI 버전 3.14 이후로.
Python 객체 o 의 참조 횟수를 가져옵니다.
반환된 값이 실제로 객체에 대한 참조가 얼마나 유지되고 있는지를 정확하게 반영하지 않을 수 있음에 유의하십시오. 예를 들어, 일부 객체는 불멸 상태이며 실제 참조 수를 반영하지 않는 매우 높은 참조 횟수를 가집니다. 따라서 반환값이 0 또는 1인 경우를 제외하고는 결과가 정확하다고 신뢰해서는 안 됩니다.
객체의 참조 횟수를 설정하려면
Py_SET_REFCNT()함수를 사용하십시오.참고
Python의 자유 스레드 빌드 에서 1을 반환하는 것만으로는 o 가 다른 스레드의 접근이 없는 상태로 취급해도 안전한지 판단하기에 충분하지 않습니다. 대신
PyUnstable_Object_IsUniquelyReferenced()를 사용하십시오.함수
PyUnstable_Object_IsUniqueReferencedTemporary()도 참조하십시오.버전 3.10에서 변경:
Py_REFCNT()가 인라인 정적 함수로 변경되었습니다.버전 3.11에서 변경: 매개변수 타입이 더 이상 const PyObject* 가 아닙니다.
-
void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt)¶
객체 o 의 참조 카운터를 refcnt 로 설정합니다.
자유 스레딩이 포함된 Python 빌드 에서 refcnt 가
UINT32_MAX보다 크면 객체는 불멸 상태가 됩니다.이 함수는 불멸 객체에 아무런 영향을 주지 않습니다.
Added in version 3.9.
버전 3.12에서 변경: 불멸 객체는 수정되지 않습니다.
-
void Py_INCREF(PyObject *o)¶
객체 o 에 대한 새로운 강한 참조 를 취함을 나타내며, 이는 해당 객체가 사용 중이므로 파괴되어서는 안 됨을 의미합니다.
이 함수는 불멸 객체에 아무런 영향을 주지 않습니다.
이 함수는 보통 빌린 참조 를 제자리에서 강한 참조 로 변환하는 데 사용됩니다. 새로운 강한 참조 를 생성하려면
Py_NewRef()함수를 사용할 수 있습니다.객체 사용이 끝나면
Py_DECREF()를 호출하여 해제합니다.객체는
NULL일 수 없습니다;NULL이 아닌지 확실하지 않으면,Py_XINCREF()를 사용하십시오.이 함수가 o 를 실제로 수정할 것으로 기대하지 마십시오. 적어도 일부 객체 의 경우 이 함수는 아무런 효과가 없습니다.
버전 3.12에서 변경: 불멸 객체는 수정되지 않습니다.
-
void Py_XINCREF(PyObject *o)¶
Py_INCREF()와 유사하지만, 객체 o 가NULL일 수 있으며 이 경우 아무런 효과가 없습니다.Py_XNewRef()도 참조하십시오.
-
PyObject *Py_NewRef(PyObject *o)¶
- …의 일부 안정 ABI 버전 3.10 이후로.
객체에 대한 새로운 강한 참조 를 생성합니다. o 에 대해
Py_INCREF()를 호출하고 객체 o 를 반환합니다.더 이상 강한 참조 가 필요하지 않을 때, 참조를 해제하기 위해 해당 객체에 대해
Py_DECREF()를 호출해야 합니다.객체 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()의 함수 버전이며, 실행 시간(runtime) 중에 파이썬을 동적으로 내장할 때 사용할 수 있습니다.
-
void Py_DecRef(PyObject *o)¶
- …의 일부 안정 ABI.
객체 o 에 대한 강한 참조 를 해제합니다.
Py_XDECREF()의 함수 버전이며, 실행 시간(runtime) 중에 파이썬을 동적으로 내장할 때 사용할 수 있습니다.
-
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_DECREF()대신Py_XDECREF()를 사용하는Py_SETREF매크로의 변형입니다.Added in version 3.6.
버전 3.12에서 변경: 매크로 인자가 이제 단 한 번만 평가됩니다. 인자에 부수 효과가 있는 경우 더 이상 중복되어 발생하지 않습니다.