Python

참조 횟수

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

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 빌드 에서 refcntUINT32_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() 와 유사하지만, 객체 oNULL 일 수 있으며 이 경우 아무런 효과가 없습니다.

Py_XNewRef() 도 참조하십시오.

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

객체에 대한 새로운 강한 참조 를 생성합니다. o 에 대해 Py_INCREF() 를 호출하고 객체 o 를 반환합니다.

더 이상 강한 참조 가 필요하지 않을 때, 참조를 해제하기 위해 해당 객체에 대해 Py_DECREF() 를 호출해야 합니다.

객체 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() 의 함수 버전이며, 실행 시간(runtime) 중에 파이썬을 동적으로 내장할 때 사용할 수 있습니다.

void Py_DecRef(PyObject *o)
…의 일부 안정 ABI.

객체 o 에 대한 강한 참조 를 해제합니다. Py_XDECREF() 의 함수 버전이며, 실행 시간(runtime) 중에 파이썬을 동적으로 내장할 때 사용할 수 있습니다.

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_DECREF() 대신 Py_XDECREF() 를 사용하는 Py_SETREF 매크로의 변형입니다.

Added in version 3.6.

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