
1、说明
清除函数从interneddictionary遍历所有字符串,调整这些对象的引用计数,并将它们标记为NOT_INTERNED,这样垃圾回收就可以了。当所有的字符串都被标记为NOT_INTERNED时,将清空并删除interned字典。
2、清理实例
这个清理函数就是_PyUnicode_ClearInterned,在 unicodeobject.c 中定义。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | void
_PyUnicode_ClearInterned(PyThreadState *tstate)
{
.........
PyObject *keys = PyDict_Keys(interned);
.........
for (Py_ssize_t i = 0; i < n; i++) {
PyObject *s = PyList_GET_ITEM(keys, i);
.........
switch (PyUnicode_CHECK_INTERNED(s)) {
case SSTATE_INTERNED_IMMORTAL:
Py_SET_REFCNT(s, Py_REFCNT(s) + 1);
break ;
case SSTATE_INTERNED_MORTAL:
Py_SET_REFCNT(s, Py_REFCNT(s) + 2);
break ;
case SSTATE_NOT_INTERNED:
default :
Py_UNREACHABLE();
}
_PyUnicode_STATE(s).interned = SSTATE_NOT_INTERNED;
}
Py_DECREF(keys);
PyDict_Clear(interned);
Py_CLEAR(interned);
}
|
以上就是Python清理驻留字符串的方法,希望能对大家有所帮助。更多Python学习指路:python基础教程