1.PyStringObject
typedef struct {
PyObject_VAR_HEAD
long ob_shash; //存储字符串hash值,初始为-1
int ob_sstate; //表明该字符串是否经过intend处理
char ob_sval[1];//实际存储字符串位置,默认为一个字符数组,但创建时会根据size大小扩展此空间
} PyStringObject;
PyString_Type:
类型对象
[stringobject.c]
PyTypeObject PyString_Type = {
PyObject_HEAD_INIT(&PyType_Type)
0,
"str",
sizeof(PyStringObject),
sizeof(char), //tp_itemsize指明变长对象保存的单位长度为一个char
……
(reprfunc)string_repr, /* tp_repr */
&string_as_number, /* tp_as_number */
&string_as_sequence, /* tp_as_sequence */
&string_as_mapping, /* tp_as_mapping */
(hashfunc)string_hash, /* tp_hash */
0, /* tp_call */
……
string_new, /* tp_new */
PyObject_Del, /* tp_free */
};
2.PyStringObject的创建
PyString_FromString:
[stringobject.c]
PyObject* PyString_FromString(const char *str)
{
register size_t size;
register PyStringObject *op;
size = strlen(str); //计算size
if (size > PY_SSIZE_T_MAX) { //判断字符串长度是否超过范围
return NULL;
}
if (size == 0 && (op = nullstring) != NULL) { //nullstring对象可能未创建
return (PyObject *)op;
}
if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) { //判断单字符是否在缓冲区