循环删除列表/字典中的每一个元素及“深浅拷贝”

 一、列表元素中的删除

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]))

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

py ~ 小久

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值