一、列表元素中的删除
li = [1,2,3,4]
for i in li:
li.remove(i)
print(li) # 打印[2, 4]
原因为 for的运行过程,有一个指针来记录当前循环的元素是哪一个,⼀开始这个指针指向第0 个. 然后获取到第0个元素. 紧接着删除第0个. 这个时候. 原来是第⼀个的元素会⾃动的变成 第0个. 然后指针向后移动⼀次, 指向1元素. 这时原来的1已经变成了0, 也就不会被删除了.
# 使用del
li = [11, 22, 33, 44]
for i in range(0, len(li)):
del li[i]
print(li) # 报错
#
# pop
for el in li:
li.pop() # pop也不⾏
print(li) # [11, 22]
# remove
for e in li:
li.remove(e)
print(li) # 结果为[22, 44]
# li = [11, 22, 33, 44] # for i in range(0, len(li)): # 循环len(li)次, 然后从后往前删除 # li.pop() # print(li) # .⽤另⼀个列表来记录你要删除的内容. 然后循环删除 li = [11, 22, 33, 44] del_li = [] for e in li: del_li.append(e) for e in del_li: li.remove(e) print(li)
由于删除元素会导致元素的索引改变, 所以容易出现问题. 尽量不要再循环中直接去删 除元素. 可以把要删除的元素添加到另⼀个集合中然后再批量删除.
二、字典(dict)元素删除
dict中的元素在迭代过程中是不允许进⾏删除的
dic = {'k1': 'alex', 'k2': 'wusir', 's1': '⾦⽼板'}
# 删除key中带有'k'的元素
for k in dic:
if 'k' in k:
del dic[k] #报错 dictionary changed size during iteration, 在循环迭代的时候不允许进⾏删除操作
print(dic)
那怎么办呢? 把要删除的元素暂时先保存在⼀个list中, 然后循环list, 再删除
dic = {'k1': 'bab', 'k2': 'w', 's1': '⽼板'}
dic_list = []
# 删除key中带有'k'的元素
for k in dic:
if 'k' in k:
dic_list.append(k)
for el in dic_list:
del dic[el]
print(dic)
tips:
类型转换:
元组 => 列表 list(tuple)
列表 => 元组 tuple(list)
list=>str str.join(list)
str=>list str.split()
转换成False的数据: 0,'',None,[],(),{},set() ==> False
# 直接赋值,内存地址指向相同
对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 所以. lst1的内存指向和lst2是⼀样的. lst1改变了, lst2也发⽣了改变
lst1 = ["⾦⽑狮王", "紫衫⻰王", "⽩眉鹰王", "⻘翼蝠王"]
lst2 = lst1
print(lst1)
print(lst2)
lst1.append("杨逍")
print(lst1)
print(lst2)
print(id(lst1),id(lst2))
# 结果
# ['⾦⽑狮王', '紫衫⻰王', '⽩眉鹰王', '⻘翼蝠王']
# ['⾦⽑狮王', '紫衫⻰王', '⽩眉鹰王', '⻘翼蝠王', '杨逍']
# ['⾦⽑狮王', '紫衫⻰王', '⽩眉鹰王', '⻘翼蝠王', '杨逍']
# 29347784 29347784
三、浅拷贝
lst1 = ["何炅", "杜海涛","周渝⺠"]
lst2 = lst1.copy()
lst1.append("李嘉诚")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
# 两个lst完全不⼀样. 内存地址和内容也不⼀样. 发现实现了内存的拷⻉
四、深拷贝
深度拷⻉. 把元素内部的元素完全进⾏拷⻉复制. 不会产⽣⼀个改变另⼀个跟着 改变的问题
import copy
lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("⽆敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))