python3.6入门到高阶(全栈) day07 深浅拷贝

一. 基础数据部分的补充
1. join: 把列表中的数据进行拼接。 拼接成字符串
例 lst = ["alex", "wusir", "ritian", "taibai"]
s = "_".join(lst) # 吧列表拼接起来. split()相反
print(s)
alex_wusir_ritian_taibai
--------------
例 s = ""
for el in lst:
s += el + "_"
print(s.strip("_"))

字符串转化成列表: split()
列表转化成字符串:join()
x->y类型 y(x)
表示False的数据类型: False, 0, "", [], tuple(), dict(), set(), None.
'''类型转换:
元组 => 列表 list(tuple)
列表 => 元组 tuple(list)
list=>str str.join(list)
str=>list str.split()
转换成False的数据:
0,'',None,[],(),{},set() ==> False
'''

2. 关于删除:
列表和字典在循环的时候都不能删除。
把要删除的内容保存在新列表中。 循环新列表。 删除老列表(字典)
lst = ["王大锤", "王有才", "张小白", "刘大哥"]
for el in let:
lst.remove(el) # 删除是不彻底的, 原因是每次删除都会导致元素的移动, 每次都会更新一次索引
要把删除的内容记录在一个新的表格中(注意: 由于删除元素会导致元素的索引改变, 所以容易出现问题.
尽量不要再循环中直接去删除元素. 可以把要删除的元素添加到另⼀个集合中然后再批量删除. )
例: new_lst = []
for el in lst:
new_lst.append(el) # 循环这个列表 删除原来的列表
for el in new_lst: # 不会导致循环的列表的元素移动的问题
lst.remove(el) # 注意 删除的是老的列表
例: lst = ["王大锤", "王有才", "张小白", "刘大哥"] # 删除掉姓王的
new_lst =[] # 装要删除的内容
for el in lst:
if el.startswith("王") # 判断字符串是否以"xxx"开头
new_lst.append(el)
for el in new_lst: # 找到再执行删除
lst.remove(el)
字典删除:{}
例: dic = {"jay":'周杰伦', "jj":"林俊杰 ", "jack": "莱昂纳多迪卡普里奥"}
#dic.clear()
or
lst = [] # 所有的key
for el in dic:
lst.append(el)
for el in lst:
dic.pop(el) # 删除对应的key

3. fromkeys
dict.fromkeys(iter, value)
把可迭代对象进行迭代。 和后面的value组合成键值对 返回新字典
例 dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
print(dic)
结果:
{'jay': ['周杰伦', '麻花藤'], 'JJ': ['周杰伦', '麻花藤']}
注意:
例 dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"])
print(dic)
dic.get("jay").append("胡大")
print(dic)
结果:
{'jay': ['周杰伦', '麻花藤', '胡⼤'], 'JJ': ['周杰伦', '麻花藤', '胡⼤']}
代码中只是更改了jay那个列表. 但是由于jay和JJ⽤的是同⼀个列表. 所以. 前⾯那个改了. 后
⾯那个也会跟着改

坑1: 返回新字典。不会改变原来的字典
dic = {} # 新建字典
dd =dict() # 新建字典
ddd ={} # 新建字典
dic.fromkeys(xxx, xxx) #fromkeys 是创建新字典,不是在原有的基础上给你增加键值对
print(dic) # {}
坑2:
d = fromkeys(xxx.[])
字典中的所有的value都是同一个列表
d =dict.fromkeys("周杰伦",['美特斯邦威'])
print(d) # {'周': ['美特斯邦威'], '杰': ['美特斯邦威'], '伦': ['美特斯邦威']}
d['周'].append('爽歪歪')
print(d) # {'周': ['美特斯邦威', '爽歪歪'], '杰': ['美特斯邦威', '爽歪歪'], '伦': ['美特斯邦威', '爽歪歪']}
## value如果是可变的数据类型。所有的key都可以改动这个数据。一个改动,所有的value都跟着改变

二. set集合
特点:无序 不重复(字典自身不重复)。 set本身可变,不可hash . 内部元素必须可hash哈希(int,str,tuple,bool)
是dict类型的数据但是不保存value ,只存key,set也用{}表示
字典{}
字典的key, 不可变 不能重复 底层存储是无序的
set{}
set里的元素,不可变 不能重复 底层也是无序的, 可hash
应用:去重复
例 lst = ["周杰伦",'周杰伦','王力宏','王力宏','馄饨面')
s =set(lst) # 去重集合
print(s)
print(list(s)) # 转列表
1. add() 添加
s = {'刘嘉玲','关之琳','王祖贤'}
s.add('王宝强')
print(s)
s.add('王宝强') # 重复的内容不会被添加到set集合中
print(s)
update()
s.updte(['张曼玉','王祖蓝','王祖蓝'])
print(s) # 无序的添加新元素,重复的内容依旧不会被添加到set集合中
2 删除
pop() # 随机弹出⼀个.
remove() # 直接删除元素
clear # 清空set集合.需要注意的是set集合如果是空的.
打印出来是set() 因为要和dict区分的.


3 修改 (没有索引,无法直接定位元素,不能直接修改)
先remove 再add
4 查询 # set 是可迭代对象,所以可for循环
for el in s:

三. 深浅拷贝(画图理解)
1. = 赋值操作没有创建新的对象。 此时 两个变量指向的是同一个内存地址
例 lst1 = ["⾦⽑狮王", "紫衫⻰王", "⽩眉鹰王", "⻘翼蝠王"]
lst2 = lst1
print(lst1)
print(lst2)
lst1.append("杨逍")
print(lst1)
print(lst2)
结果:
['⾦⽑狮王', '紫衫⻰王', '⽩眉鹰王', '⻘翼蝠王', '杨逍']
['⾦⽑狮王', '紫衫⻰王', '⽩眉鹰王', '⻘翼蝠王', '杨逍']
例 dic1 = {"id": 123, "name": "谢逊"}
dic2 = dic1
print(dic1)
print(dic2)
dic1['name'] = "范瑶"
print(dic1)
print(dic2)
结果:
{'id': 123, 'name': '谢逊'}
{'id': 123, 'name': '谢逊'}
{'id': 123, 'name': '范瑶'}
{'id': 123, 'name': '范瑶'}
对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量.
并不是复制⼀份内容. 所以.lst1的内存指向和lst2是⼀样的. lst1改变了, lst2也发⽣了改变

2. copy() [:] 浅拷贝。 拷贝第一层内容
# 优点: 省内存.
# 缺点: 容易出现同一个对象被多个变量所引用
例 lst1 = ["何炅", "杜海涛","周渝⺠"]
lst2 = lst1.copy()
lst1.append("李嘉诚")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
结果:
# 两个lst完全不⼀样. 内存地址和内容也不⼀样. 发现实现了内存的拷⻉
例 lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
lst2 = lst1.copy()
lst1[3].append("⽆敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
4417248328 4417248328
# 浅拷⻉. 只会拷⻉第⼀层. 第⼆层的内容不会拷⻉. 所以被称为浅拷⻉

3. 深拷贝
# 优点: 完全拷贝出一份两个对象之间除了数据相同。 没有任何关系
# 缺点: 占内存
import copy
copy.deepcopy() 深度拷贝。 把对象内部的所有内容都拷贝一份
作用: 快速创建对象
例 import copy
lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("无敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅', '⽆敌是多磨寂寞']]
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '⻢芸', '周笔畅']]
4447221448 4447233800
# 都不⼀样了. 深度拷⻉. 把元素内部的元素完全进⾏拷⻉复制.
不会产生⼀个改变另⼀个跟着改变的问题
posted @ 2018-10-25 15:10  曾经有个贵族  阅读(180)  评论(0编辑  收藏  举报