python源码 字符串拼接调用

python 字符串底层实现原理字符串对象在python内部用`PyStringObject`表示,具体结构如下:
typedef struct { PyObject_VAR_HEAD long ob_shash; int ob_sstate; char ob_sval;} 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=\u0026#39;\\0\u0026#39;`,但实际上创建一个`PyStringObject`时,`ob_sval`指向的是一段长为`ob_size` + 1个字节的内存
`ob_shash`:是字符串对象的哈希值,初始值为-1,在第一次计算出字符串的哈希值后,会把该值缓存下来,赋值给`ob_shash`
`ob_sstate`:用于标记该字符串是否进过intern机制
【python源码 字符串拼接调用】 字符串的INTERN机制
\u0026gt;\u0026gt;\u0026gt; a = \u0026#39;test\u0026#39;\u0026gt;\u0026gt;\u0026gt; b = \u0026#39;test\u0026#39;\u0026gt;\u0026gt;\u0026gt; a is bTrue\u0026gt;\u0026gt;\u0026gt;当创建a时,系统会首先创建一个`PyStringObject`对象出来,然后经过intern机制处理,接着查找经过intren处理过的`PyStringObject`对象,如果发现有该字符串对应的`PyStringObject`存在,则直接返回这个对象并且增加该字符串对象的引用计数,否则就把它加入到intern机制当中。由于a和b字符串值是一样的,所以当未b赋值时,直接就返回了a中的`PyStringObject`对象。所以他们的内存地址相同。
字符串的拼接操作
字符串拼接通常有两种方式:
1. 利用\u0026#39;+\u0026#39;
2. str.join()函数
\u0026#39;+\u0026#39;方法,会重新申请一段内存,把连接后的字符串复制到新的内存中,也就是说N个字符串会申请N-1次内存
str.join()方法,接受一个list或者可迭代对象,统计有多少个字符串,统一分配内存,然后将连接后的字符串复制到新的内存当中


    推荐阅读