python 字符串底层实现原理

python 字符串底层实现原理

python 字符串底层实现原理

字符串对象在python内部用`PyStringObject`表示,具体结构如下:

typedef struct {
PyObject_VAR_HEAD
long ob_shash;
int ob_sstate;
char ob_sval[1];
} PyStringObject;

`PyObject_VAR_HEAD `就是在将整数数据结构中`PyObject_HEAD `又加了一个`ob_size`属性

#define PyObject_VAR_HEAD 
PyObject_HEAD
int ob_size; /* Number of items in variable part */
typedef struct {
PyObject_VAR_HEAD
} PyVarObject;

`ob_size`:保存对象中元素的长度,比如"python"字符串的`ob_size`为6

`ob_sval`:是一个初始大小为1的字符数组,且`ob_sval[0]='\\0'`,但实际上创建一个`PyStringObject`时,`ob_sval`指向的是一段长为`ob_size` + 1个字节的内存

`ob_shash`:是字符串对象的哈希值,初始值为-1,在第一次计算出字符串的哈希值后,会把该值缓存下来,赋值给`ob_shash`

`ob_sstate`:用于标记该字符串是否进过intern机制

字符串的INTERN机制

>>> a = 'test'
>>> b = 'test'
>>> a is b
True
>>>

当创建a时,系统会首先创建一个`PyStringObject`对象出来,然后经过intern机制处理,接着查找经过intren处理过的`PyStringObject`对象,如果发现有该字符串对应的`PyStringObject`存在,则直接返回这个对象并且增加该字符串对象的引用计数,否则就把它加入到intern机制当中。由于a和b字符串值是一样的,所以当未b赋值时,直接就返回了a中的`PyStringObject`对象。所以他们的内存地址相同。

字符串的拼接操作

字符串拼接通常有两种方式:

1. 利用'+'

2. str.join()函数

'+'方法,会重新申请一段内存,把连接后的字符串复制到新的内存中,也就是说N个字符串会申请N-1次内存

str.join()方法,接受一个list或者可迭代对象,统计有多少个字符串,统一分配内存,然后将连接后的字符串复制到新的内存当中


分享到:


相關文章: