Python字符串对象PyStringObject
Python的字符串对象是一个不可变对象,任何改变字符串字面值的操作都是重新创建一个新的字符串。
|
|
字符串对象在Python中用PyStringObject
表示,扩展定义后如下。
|
|
ob_type
字符串的类型指针,实际指向PyString_Type
ob_size
保存的是字符串的实际长度,也是通过len(s)
返回的长度值。而字符串实际占用的内存是ob_size + 1
,因为C语言中需要额外的NULL
作为字符串结束标识符。
ob_sval
是实际存储字符串的内存,分配时会请求sizeof(PyStringObject)+size
的内存,这样以ob_sval
开始的内存长度就是size + 1
的长度,正好用来存放以NULL
结尾的字符串。
ob_shash
是字符串的hash值,当字符串用来比较或者作为key时可以加速查找速度,默认值为-1。
|
|
ob_sstate
记录字符串对象的状态。字符串可能有三种状态:
|
|
字符串的interned
字符串对象是不可变对象,因此相同的字面值的变量可以绑定到相同的字符串对象上,这样减少了字符串对象的创建次数。这样的行为称为interned
。默认情况下空字符串和单字符字符串会被interned
。
|
|
另外一些情况下,例如__dict__
、模块名字等预计会被大量重复使用或者永久使用的字符串,在创建时也会调用PyString_InternInPlace
进行interned
操作。
|
|
字符串对象的回收
当字符串的引用计数为零时会被回收。
|
|
字符串对象的其他操作
可以通过字符串对象的类的结构中找到对象的操作函数。
|
|
tp_base
被赋值为PyBaseString_Type
,因此字符串对象是basestring
的子类。
(完)