背景
在3月份就有可信考试,在做完一次模拟考试后,发现自己68道题,只答对了20来道。打击很大,试题主要是一些常用的操作,split, 字符截取, 列表深浅拷贝, 对象引用。这里主要记录一下这些方法。
目录
-
字符串
- 字符分割
- 字串截取
-
列表
- join拼接
- 深浅拷贝
字符串
字符分割
字符分割是通过任意字符作为分割符,对字符串进行切分,最终结果是以数组的形式展现出来。默认分割符号是空白符(空格,换行符\n,制表符\t),作为分割字符的参数要作为字符串参数传递。
split(sep,maxsplit)接收2个参数分别是sep和maxsplit, sep分割符,默认是空白符,maxsplit分割次数,默认-1,分割所有。
示例
str1 = " yyxyz yyx\nyzxy\tzyy yyxyzxyzyy "
print(str1.split())
print(str(str1.split()).split('yy', maxsplit=1))
print(str(str1.split()).split('yy', maxsplit=-1))
结果如下
['yyxyz', 'yyx', 'yzxy', 'zyy', 'yyxyzxyzyy']
["['", "xyz', 'yyx', 'yzxy', 'zyy', 'yyxyzxyzyy']"]
["['", "xyz', '", "x', 'yzxy', 'z", "', '", 'xyzxyz', "']"]
详细分析流程
str1.split()采用的是默认分割符,也就是空格、换行符、制表符都会被作为分割符。
初始字符串:" yyxyz yyx\nyzxy\tzyy yyxyzxyzyy "
第一次分割:"yyx\nyzxy\tzyy yyxyzxyzyy " ---> ['yyxyz']
第二次分割:"yzxy\tzyy yyxyzxyzyy " ---> ['yyxyz', 'yyx"]
第三次分割:"zyy yyxyzxyzyy " ---> ['yyxyz', 'yyx", 'yzxy']
第四次分割:"yyxyzxyzyy " ---> ['yyxyz', 'yyx', 'yzxy', 'zyy']
第五次分割:['yyxyz', 'yyx', 'yzxy', 'zyy', 'yyxyzxyzyy']
注意点:虽然字符开头就是分割符,但是却不是就拿开头分割一次就算了,而是下开头的分割符的紧邻的非分割字符的下一个分割符作为第一分割符。
str(str1.split()).split('yy', maxsplit=1)使用字符串'yy'作为分割符, 只分割一次。
str(str1.split())的数据为"['yyxyz', 'yyx', 'yzxy', 'zyy', 'yyxyzxyzyy']"字符串类型
初始字符串:"['yyxyz', 'yyx', 'yzxy', 'zyy', 'yyxyzxyzyy']"
第一次分割:"xyz', 'yyx', 'yzxy', 'zyy', 'yyxyzxyzyy']" ---> ["['"]
分割原理同str1.split()
易错点
- 空格分割传入参数为str1.split(" ")
- 分割符不是以字符串的形式传入 str1.split(yy)
小结
字符串分割本质就是以传入的分割符作为边界,将字符串一分为二。
列表
join拼接
针对字符类型元素的列表,将列表元素按照指定字符拼接在一起,例如("#".join(['1', '2', '3'])) -> '1#2#3'。
列表元素一定要是字符,否则引发系统中断。

深浅拷贝
深浅拷贝指代列表变量拷贝数据的层次,浅拷贝拷贝的是数据的第一层,对于列表中的指针元素,值仍然是直接拷贝。例如:src = [1, '2', (1, '2'), {"info": "test"}, [1, '2']], 浅拷贝之后src_ligth_copy[4]的地址仍然指向原变量的地址。深拷贝则是对于所以得数据都会拷贝一份副本,src_height_copy[4]的地址则指向新的地址。
验证如下
src = [1, '2', (1, '2'), {"info": "test"}, [1, '2']]
src_a = src
light_copy = copy.copy(src)
height_copy = copy.deepcopy(src)
src.append(1)
src.append('2')
src[4].append(1)
print("src id: {0}, value: {1}".format(id(src), src))
print("src_a id: {0}, value: {1}".format(id(src_a), src_a))
print("light_copy id: {0}, value: {1}".format(id(light_copy), light_copy))
print("height_copy id: {0}, value: {1}".format(id(height_copy), height_copy))
print("src[4] id: {0}, value: {1}".format(id(src[4]), src[4]))
print("light_copy[4] id: {0}, value: {1}".format(id(light_copy[4]), light_copy[4]))
print("height_copy[4] id: {0}, value: {1}".format(id(height_copy[4]), height_copy[4]))
结果如下
src id: 2750210901248, value: [1, '2', (1, '2'), {'info': 'test'}, [1, '2', 1], 1, '2']
src_a id: 2750210901248, value: [1, '2', (1, '2'), {'info': 'test'}, [1, '2', 1], 1, '2']
light_copy id: 2750210865920, value: [1, '2', (1, '2'), {'info': 'test'}, [1, '2', 1]]
height_copy id: 2750210865664, value: [1, '2', (1, '2'), {'info': 'test'}, [1, '2']]
src[4] id: 2750210865088, value: [1, '2', 1]
light_copy[4] id: 2750210865088, value: [1, '2', 1]
height_copy[4] id: 2750210864960, value: [1, '2']
结果可以看到浅拷贝的第四项列表元素的地址跟初始变量的列表第四项的地址是指向同一块内存,而深拷贝则是指向了另外一块内存。
对于原始变量的数据的改变,如果修改的是数组, 浅拷贝的变量的这个值也会发生改变,而深拷贝则不会发生任何变化。
浙公网安备 33010602011771号