这一章, 就一张图, 代码比较多
PyStringObject
源码位置 Include/stringobject.h |
Objects/stringobject.c
定义
123456789101112131415 | typedef struct { PyObject_VAR_HEAD long ob_shash; int ob_sstate; char ob_sval[1]; /* Invariants: * ob_sval contains space for \’ob_size+1\’ elements. * ob_sval[ob_size] == 0. * ob_shash is the hash of the string or -1 if not computed yet. * ob_sstate != 0 iff the string object is in stringobject.c\’s * \’interned\’ dictionary; in this case the two references * from \’interned\’ to this object are *not counted* in ob_refcnt. */} PyStringObject; |
说明
12345678910111213 | 1. PyObject_VAR_HEADPyStringObject是变长对象, 比定长对象多了一个ob_size字段 2. ob_shash存储字符串的hash值, 如果还没计算等于–1当string_hash被调用, 计算结果会被保存到这个字段一份, 后续不再进行计算 3. ob_sstate如果是interned, !=0, 否则=0interned后面说 4. char ob_sval[1]字符指针指向一段内存, char数组指针, 指向一个ob_size+1大小数组(c中字符串最后要多一个字符``表字符串结束) |
结构
构造方法
123 | PyAPI_FUNC(PyObject *) PyString_FromString(const char *); PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t); |
两个构造方法其实区别不大,
123 | PyString_FromStringAndSize 参数可以为`NULL`, 无论是否为`NULL`, 都会分配`size+1`个字节空间.(不为NULL的话字符数组会进行拷贝) PyString_FromString, 参数不能为`NULL`, 且必须是``结束的字符数组, 会调用c 语言string.h模块的strlen()函数计算字符串长度, 分配空间, 并将整个字符数组拷贝到ob_sval指向的内存 |
我们关注PyString_FromString
就行
创建过程 PyString_FromString
定义
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667ta-line=\”crayon-5812b3c356d59815243318-63\”>6364656667/h1>
源码位置 Include/stringobject.h | 定义
说明
结构 构造方法
两个构造方法其实区别不大,
我们关注 创建过程 PyString_FromString定义
|