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或者可迭代对象,统计有多少个字符串,统一分配内存,然后将连接后的字符串复制到新的内存当中
推荐阅读
- 怎样成为一名合格的Python程序员?
- python 爬虫,咋获得输入验证码之后的搜索结果
- python的html5lib这个库咋使用啊我在网上也没有找到相关文档
- 零基础入门学习啥语言好
- Python3.4和3.5区别大么
- python 中 def_():...... return _有啥作用
- 新互联网网站用Java还靠谱么对比Php,Python,Ruby的话
- 30岁男,创业失败转行学python,是否很晚?也不好找工作?
- Python 的开发速度比 C#.net 或 Vb.net 更快吗?
- 16年毕业,建筑环境与设备工程专业,干的一直是工程想转IT专业,想从python入手请问咋开始学习