day007深度拷贝和数据补充、set去重、fromkeys
一、基础数据的补充
类型转换:
元组 --> 列表 list(tuple)
列表 --> 元组 tuple(list)
list --> str str.join(list)
str --> list str.split()
1.list和str连接
s = "_"join(list) # 用_将列表中的元素连接,并以字符串的形式输出
2.列表
关于删除
1、列表和字典再循环的时候都不能删除
2、把要删除的内容保存到新列表,然后再循环新列表,删除旧列表(字典)
fe: 删除列表
li = [11, 22, 33]
del_li = []
for e in li:
del_li.append(e)
for e in del_li:
li.remove(e)
print(li)
fe2: # 删除字典
dic = {"a": 1, "b": 2}
del_dic = {}
for k in dic:
if k == "a":
del_dic[k] = dic[k] # 将要删除的键值对,提取到新字典
print(del_dic)
for k in del_dic:
dic.pop(k) # 循环要新字典,然后在旧的字典中删除
print(dic)
fe3: # 删除字典方法二
dic = {"a": 1, "b": 2} # list(dic) 可以得到一个包含所有键的列表
for k in list(dic): # 这里将字典转换成了列表循环,然后再删除字典
del dic[k]
print(dic)
3、fromkeys
dict.fromkeys(iter, value)
把可迭代对象进行迭代,与后面的value组成键值对,返回新字典。
坑1:
返回新字典,不会改变已有的字典
dic = {}
dic.fromkeys(iter, value) # iter迭代产生一个新字典,不对dic进行任何操作
print(dic) # 打印{}, 跟dic.fromkeys无关,他是生成了另外一个字典
坑2:
如果你的value 是可变类型的,那么所有的key都可以改变这个数据
d = dict.fromkeys("百元", [11,"大关"]) # 生成的value的内存地址一样,所以改一个,全部都会变
print(d)
d["元"].append("胡辣汤")
print(d)
print(id(d["百"]), id(d["元"])) # value的内存地址一样
二、set 集合
特点: 无序、不重复, 内部元素必须可哈希
作用: 主要用来去重
1.add 添加、
三、深度拷贝(画图理解)
1.赋值
= 赋值,此时创建新的对象,两个变量指向的是同一个内存地址
2.浅拷贝
copy 或者 [:] 拷贝第一层内容
优点:省内存
缺点:容易出现同一对象被多个变量引用
fe:
lst1 = ["孙悟空", "贝吉塔", "卡卡罗特",["七龙珠","战斗陀螺"]]
lst2 = lst1.copy() # 浅拷贝
# lst1.append("短笛")
lst1[3].append("巴啦啦小魔仙")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
fe:
情况一、创建了新的对象(副本),原件再发生变化,内存地址不一样,副本不变
情况二、创建了新对象,但是原件中含有可变的内容(list),原件更改可变内容,因为内存地址一样,所以会跟着改变
第一种情况
第二种情况
3.深拷贝
inport copy # y引入拷贝模块
copy.deepcopy(list)
优点:完全拷贝出一份两个对象,除了数据一样,没有任何关系
缺点:占内存
fe:
import copy # 引入拷贝模块
lst1 = ["孙悟空", "贝吉塔", "卡卡罗特",["七龙珠","战斗陀螺"]]
lst2 = copy.deepcopy(lst1) # 会把这个对象相关的内部信息全部复制一份
lst1[3].append("巴啦啦小魔仙")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
# 共同有点: 快速创建对象 -> 原型模式(设计模式)深拷贝
代理模式,中间进行操作,不影响源头,不影响终端
工厂模式,将各种各样的输入,然后经过这个工厂,产生成品