python深浅拷贝
字节与字符串的关系:8byte = 1kb,字节是计算机内的最小单位,字符串是能看到的最小单位
list的特殊情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | li1 = [ 11 , 22 , 33 , 44 , 55 ] #循环删除,每一个元素 for i in range (leng(li1)) : del li1[i] print (i) print (li1) $列表分配索引超出范围 0 [ 22 , 33 , 44 , 55 ] 1 [ 22 , 44 , 55 ] 2 [ 22 , 44 ] $IndexError: list assignment index out of range 分析原因: 第一次循环当i等于 0 时删除索引为 0 的元素 22 ,列表变为[ 22 , 33 , 44 , 55 ] 第二次循环当i等于 1 时删除索引为 1 的元素 33 ,列表变为[ 22 , 44 , 55 ] 第三次循环当i等于 2 时删除索引为 2 的元素 55 ,列表变为[ 22 , 44 ] 第四次循环当i等于 3 时删除索引为 3 的元素不存在,报错 列表可变每次删除元素,列表都发生变化,导致出现上面问题 |
删除列表方法:
1 2 3 4 | 1. 采用倒序删除法<br>li1 = [ 11 , 22 , 33 , 44 , 55 ] for i in range ( len (li1) - 1 , - 1 , - 1 ) : del li1[i] print (li1)<br> 2. 使用深拷贝先定义范围,再循环删除lis = [ 11 , 22 , 33 , 44 , 55 ]<br> import copy<br> for i in copy.deepcopy(lis) :<br> lis.remove(i)<br> print (lis) |
习题:删除列表奇数位(二种方法)
1 2 3 4 5 | li1 = [ 11 , 22 , 33 , 44 , 55 ] li1 = li1[ 1 :: 2 ] print (li1) $[ 22 , 44 ]li1 = [ 11 , 22 , 33 , 44 , 55 ]<br> for i in range ( len (li1) - 1 , - 1 , - 2 ) :<br> del li1[i]<br> print (li1)$[ 22 , 44 ]<br><br> |
分析题:
1 2 3 4 5 6 7 8 9 10 11 | lis = [ 11 , 22 , 33 , 44 , 55 ] for i in lis : lis.pop() print (lis) $[ 11 , 22 ] $为什么不会全部删除 $第一次进入循环i等于 11 ,删除最后一个元素 55 ,列表变为[ 11 , 22 , 33 , 44 ] $第二次进入循环i等于 22 ,删除最后一个元素 44 ,列表变为[ 11 , 22 , 33 ] $第三次进入循环i等于 33 ,删除最后一个元素 33 ,列表变为[ 11 , 22 ] $第四次进入循环列表元素改变,不会再次循环<br><br>这样可以解决问题 for i in range ( len (lis)) :<br> lis.pop()<br> print (lis) |
dict的特殊情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #dict.fromkeys(seq[,value]) dict1 = dict .fromkeys( 'asdfasdf]' ) ${ 'a' : None , 's' : None , 'd' : None , 'f' : None , ']' : None } #易范错误 dic = dict .fromkeys([ 1 , 2 , 3 ], '春哥' ) dic = dict .fromkeys([ 1 , 2 , 3 ],[]) print (dic) ${ 1 :[], 2 :[], 3 :[]) dic[ 1 ].append( 'abc' ) dic[ 2 ].extend( '二哥' ) ${ 1 : [ 'abc' , '二' , '哥' ], 2 : [ 'abc' , '二' , '哥' ], 3 : [ 'abc' , '二' , '哥' ]} |
字典的删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #循环删除字典中键中包含'K‘的键值对(两种方法) dic1 = { 'k1' : 'v1' , 'k2' : 'v2' , 'a3' : 'v3' } li1 = [] for key,value in dic1.items() : if 'k' not in key : li1.append({key:value}) print (li1) #能过列表操作字典 dic1 = { 'k1' : 'v1' , 'k2' : 'v2' , 'a3' : 'v3' } li1 = [] for key in dic1 : if 'k' in key : li1.append(key) for i in li1 : del dic1[i] print (dic1) |
基本数据类型bool值为False的情况
1 2 3 | print ( bool ( 0 ), bool (''), bool ([]), bool (()), bool ({}), bool ( set ())) $ False False False False False False |
集合
可变的数据类型,集合元素必须是不可变数据类型,无序,集合自动去重复
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 基本操作: set1 = set ({ 1 , 2 , 3 }) set2 = set { 1 , 2 , 3 ,[ 2 , 3 ],{ 'name' : 'alex' }} 错 print (set1) 打印无序 增 set .add('') set .update('') 删 set .pop 随机删除,有返回值 set .remove 按元素删除,没有元素报错 set .clear() 清空列表 $ set () 空集合,{}空字典 del set 整删除,报错 改 不可变数据类型,无序不能改 for i in set : print (i) |
比较方法:
1 2 3 4 5 6 7 8 9 10 11 | set1 = { 1 , 2 , 3 , 4 , 5 } set2 = { 4 , 5 , 6 , 7 , 8 } #交集 & set3 = set1 & set2 #并集(所有元素) | union(联合) set3 = set1 | set2 #反交集 ^ symmetric_difference set3 = set1 ^ set2 #差集 第一个集合独有 set3 = set1 - set2 #子集和超集 < issubset issuperset |
集合方法:
1 | 集合本身是可变数据类型,可以使用frozense()将集合冻住 |
深浅拷贝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | l1 = [ 1 , 2 , 3 ] l2 = l1 l1.append( 'a' ) print (l1,l2) #浅拷贝copy l1 = [ 1 , 2 , 3 ] l2 = l1.copy() print (l1,l2,l1 is l2) l2.append( 'a' ) print (l1,l2) l1 = [ 1 , 2 ,[ 4 , 5 , 6 ], 3 ] l2 = l1.copy() print (l1,l2,l1 is l2) l2.append( 'a' ) print (l1,l2) l1[ 2 ].append( 'a' ) print (l1,l2) print ( id (l1[ 2 ]), id (l2[ 2 ])) #深拷贝copy #import coyp l1 = [ 1 , 2 , 3 ] l2 = copy.deepcopy(l1) |
枚举类型enumerate
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
enumerate(sequence, [start=0])
1 2 3 4 5 6 | li = [ 'a' , 'b' , 'c' , 'd' ] for index,value in enumerate (li) : print (index,value) #数字列可以设置开头列 for index,value in enumerate (li, 100 ) : print (index,value) |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步