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或者可迭代對象,統計有多少個字符串,統一分配內存,然後將連接後的字符串複製到新的內存當中


分享到:


相關文章: