Python基础七(深浅copy)
一、字符串用法回顾
基础数据类型,总结补充.
int:bit_lenth()
str:
captilze() 首字母大写,其余小写.
upper() 全大写.
lower() 全小写.
find() 通过元素找索引,没有返回-1,有切片.
index() 通过元素找索引,没有回报错.有切片
swapcase() 大小写反转.
strip() 去除前后端的空格,\n,\t,
strip('abc') 去除前后端的a ,b,c三个元素,
ltrip ,rtrip
title 非字母隔开的部分,首字母大写
split str---> list 默认以空格(可以设定分隔符),
startswith 判断s以什么开头,返回bool值,可以切片
endswith 判断以什么结尾,返回bool值,可以切片
replace(old,new) 默认不写次数,全体换
center 以其为中心,默认填充物 空格.
count 计算元素出现的次数.
len() 测量字符串的长度.
join '' '*' '_'.... .join(interable)
isalpha() 全都是字母组成
isdigit() 全都是数字组成
isalnum() 全都是字母或者数字
'%s' %(name)
name1 = 'taibai '
'%(name)s' %{name:name1}
format
'{}{}{}'.format(name,age,hobby)
'{0}{1}{2}{1}'.format(name,age,bobby)
'{name},{age}'.format(age=12,name='太白')
s = ' ' #只能是以至少一个空格组成的字符串(全空格)
print(s.isspace())-----Ture
二、元组小知识点补充
当元组只有一个元素组成并且没有‘,’
则该元素是什么数据类型,整体就是什么数据类型.
tu = (1) tu1 = (1,) print(tu,type(tu)) print(tu1,type(tu1)) tu = ('alex') tu1 = ('alex',) print(tu,type(tu)) print(tu1,type(tu1)) tu = ([1,2,3]) tu1 = ([1,2,3],) print(tu,type(tu)) print(tu1,type(tu1)) 对应输出 1 <class 'int'> (1,) <class 'tuple'> alex <class 'str'> ('alex',) <class 'tuple'> [1, 2, 3] <class 'list'> ([1, 2, 3],) <class 'tuple'>
三、list 、dic补充
1、list补充
l1 = [111,222,333,444,555] #将索引为奇数位的元素删除.
方法一: l1 = [111,222,333,444,555] l2 = [] for i in range(len(l1)): if i % 2 == 0: l2.append(l1[i]) l1 = l2 print(l1) 方法二: l1 = [111,222,333,444,555] for i in range(1,len(l1)): if i <= 2 : l1.pop(i) print(l1) 方法三: l1 = [111,222,333,444,555,666,777] # del l1[1::2] print(l1) 方法四: l1 = [111,222,333,444,555] for i in range(len(l1)-1,0,-1): if i % 2 == 1: del l1[i] print(l1)
总结:
在循环一个列表时,如果要是删除某些或者某类元素,容易出错
2、dic补充
fromkeys()用法
dic = dict.fromkeys('abc','alex') print(dic) dic1 = dict.fromkeys([1,2,3],[]) print(dic1) dic1[1].append('alex') print(dic1) 输出 {'a': 'alex', 'b': 'alex', 'c': 'alex'} {1: [], 2: [], 3: []} {1: ['alex'], 2: ['alex'], 3: ['alex']}
补充二、
不可变的数据类型:可哈希 for i in dic: if 'k' in i: del dic[i]-------不可行 l1 = [] for i in dic: if 'k' in i: l1.append(i) print(l1) for k in l1: del dic[k] print(dic) 总结 在循环一个字典时,如果删除某些键值对,可能会报错,可转化成列表形式操作.
四、数据类型间的转化
数据类型之间的转化: int <---> str int <---> bool str <--->.bool split str <------> list join tuple <---> list
元组>>>>>>列表 l1 = [1,2,3] tu = tuple(l1) l2 = list(tu) print(tu,l2)------(1, 2, 3) [1, 2, 3] #dict专属类型:与list转换 dic = {'k1':'alex','k2':'太白','k3':'日天','name':'wusir'} print(list(dic.keys()))------['k1', 'k2', 'k3', 'name'] print(list(dic.values()))---['alex', '太白', '日天', 'wusir'] print(list(dic.items()))-----[('k1', 'alex'), ('k2', '太白'), ('k3', '日天'), ('name', 'wusir')]
五、深浅copy
对于赋值运算,就是共同指向一个内存地址.
l1 = [1,2,3,4] l2 = l1 l1.append(5) print(l1,l2) 输出 [1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
s1 = 'alex' s2 = s1 s1 = 'alex2' print(s1,id(s1)) print(s2,id(s2)) 输出 alex2 31133624 alex 31133568 覆盖s1的值,id地址不一样
浅copy
l1 = [1,[22,33],2,3] l2 = l1.copy() l1.append(666) print(l1,id(l1))------[1, [22, 33], 2, 3, 666] 42571272 print(l2,id(l2))------[1, [22, 33], 2, 3] 42570696
#对于浅copy来说,第一层都是独立的内存地址,从第二层开始,都是指向同一个内存地址,一变都变
l1 = [1,[22,33,],2,3] l2 = l1.copy() l1[1].append(666) print(l1,id(l1),id(l1[1]))-------[1, [22, 33, 666], 2, 3] 36122248 42636232 print(l2,id(l2),id(l2[1]))-------[1, [22, 33, 666], 2, 3] 42637832 42636232
deepcopy 深copy
# 对于深copy,无论多少层,在内存中都是两个独立的内存地址.
import copy l1 = [1,[22,33,],2,3] l2 = copy.deepcopy(l1) l1.append(777) l1[1].append(666) print(l1,id(l1),id(l1[1]))---[1, [22, 33, 666], 2, 3, 777] 42571336 42571272 print(l2,id(l2),id(l2[1]))---[1, [22, 33], 2, 3] 42747208 42747080
补充
l1 = [1,[1,2],2,3] l2 = l1[:] # 是浅copy l1[1].append(111) print(l1,l2)---[1, [1, 2, 111], 2, 3] [1, [1, 2, 111], 2, 3]