[要点抢先看]
1. 字符串支持一些容器的基本操作, 如分片索引
2. 字符串的不可修改特性
3. 字符串的连接, 遍历和成员测试
4. 字符串赋值操作中的深拷贝与浅拷贝
python 中一项很重要的工作就是文本处理, 与之紧密相关的数据类型是字符串, 从这一集开始, 我们由浅入深介绍一系列关于字符串的内容.
[妹子说] 之前刚刚介绍了容器, 字符串应该可以看做是字符的容器吧?
可以这么理解, 字符串就是由单个字符组成的有序序列, 且不可修改.
类比前面提到的列表, 如正向索引, 反向索引, 分片索引等基于偏移量的基本操作, 字符串都是支持的.
下面列举一些与列表类似的操作, 需要强调一点的是字符串的分片操作, 分片就是从一整个字符串中分离提取出一部分内容 (即子字符串), 从而获取所需的部分数据, 并且 python 返回的是包含所获取元素的新对象.
分片操作在实际使用时用处很多, 比如: 我们可以在命令行字符串中去分离感兴趣的参数列表.
- s = 'abcdefg'
- print(s[0])
- print(s[-2])
- print(s[1:4])
- print(s[1:4:2])
- print(s[-1:1:-1])
- print(len(s))
- a
- f
- bcd
- bd
- gfedc
- 7
再来看看字符串的不可修改特性.
- s = 'abcd'
- s[0] = '4'
- Traceback (most recent call last):
- File "E:/12homework/12homework.py", line 2, in <module>
- s[0] = '4'
- TypeError: 'str' object does not support item assignment
再说说两个字符串之间的连接操作. 即所谓的字符串相加, 返回连接后生成的新字符串
- s1 = 'abcd'
- s2 = '1234'
- s = s1 + s2
- print(s)
- abcd1234
[妹子说] 那字符串的赋值, 也是用 = 直接赋值吧
对, 不过针对赋值, 有深拷贝和浅拷贝两种意义截然不同的方式.
下面这种赋值方法实际上是对象的深拷贝, 即赋值左右的两个对象具有相同值, 但是是位于不同内存片区的对象
- s = ['abcdefg']
- a = s[:]
- print(a)
- print(s is a)
- ['abcdefg']
- False
而如果是像下面这样直接赋值, 则左右两个对象实际上被分配的是同一个内存空间, 即所谓的浅拷贝
- s1 = 'abcdefg'
- s2 = s1
- print(s1 == s2)
- True
[妹子说] 明白了, 那字符串作为一种序列, 也能进行遍历和成员关系测试吧.
当然, 可以使用 for 语句在一个字符串中进行循环迭代, 并使用 in 操作符对字符和子字符串进行成员关系的测试
- s = 'hacker'
- for c in s:
- print(c, end=' ')
- h a c k e r
- print('k' in 'school')
- False
以上都是字符串与容器相类似的一些操作, 有之前几集学习的基础, 接受起来还是挺容易的.
[妹子说] 把字符串和容器序列进行类比, 很多用法就不言自明了. 这些共性的方法倒是好理解, 也比较简单, 那后面再介绍一些字符串的独门秘诀吧.
来源: https://juejin.im/post/5b3df36ce51d45194a51f0a5