python中的深浅拷贝(copy)
字符串中的join方法
将列表转换成字符串,每个元素间用"内容"拼接,
join(可迭代对象)
s = ["高华新","刘清扬","崔园樟"] s1 = "-".join(s) print(s1) >>> 高华新-刘清扬-崔园樟
split() 字符串转换成列表
ss = "高华新**刘清扬**崔园樟" print(ss.split("**")) >>> ['高华新', '刘清扬', '崔园樟']
列表和字典在循环的时候不能直接删除,需要把删除的内容放在一个新列表中,然后再循环新列表,再删除字典和列表中所对应的内容
列表的直接remove删除:
lst = ["紫云", "大云", "玉溪", "紫钻","a","b"] for el in lst: # 有一个变量来记录当前循环的位置 lst.remove(el) print(lst) >>> ['大云', '紫钻', 'b'] #删除的时候, 发现. 剩余了一下内容. 原因是内部的索引在改变. # # 需要把要删除的内容记录下来. 然后循环这个记录. 删除原来的列表
创建新列表删除
lst = ["紫云", "大云", "玉溪", "紫钻","a","b"] li = [] for i in lst: # 遍历列表中的元素 li.append(i) #将将删除的元素添加到新列表中 for i in li: #遍历新列表中的元素 lst.remove(i) #旧列表删除内容,因为遍历的是新列表中的元素,所以原来的列表元素位置就不会自动往前走,不会内部循环 # 是最安全的 print(lst) >>> [] # 空列表
lst = ["张国荣", '张铁林', '张国立', "张曼玉", "汪峰"] # 删掉姓张的 zhangs = [] for el in lst: if el.startswith("张"): # 记录姓张的. zhangs.append(el) #将姓张的放在新列表中 for el in zhangs: #遍历新列表 lst.remove(el) #删除老列表中姓张的 print(lst) >>> ['汪峰'] print(zhangs) >>> ['张国荣', '张铁林', '张国立', '张曼玉'] #新列表中全是姓张的
字典
dic = {"提莫":"冯提莫", "发姐":"陈一发儿", "55开":"卢本伟"} lst = [] for i in dic: lst.append(i) for i in lst: dic.pop(i) print(dic) >>> {}
formkeys()
直接用类(class)访问,返回新字典,对原字典没有影响
后面的value是多个key共享一个value
dic = {"apple":"苹果", "banana":"香蕉"} print(dic.fromkeys("apple","苹果")) >>> {'a': '苹果', 'p': '苹果', 'l': '苹果', 'e': '苹果'} #形成新字典,与原字典无关联,遍历前面形成key,共享后面一个value print(dic.fromkeys("ab",["苹果","橘子"])) >>> {'a': ['苹果', '橘子'], 'b': ['苹果', '橘子']}
dic = {"apple":"苹果", "banana":"香蕉"} # 返回新字典. 和原来的没关系 ret = dic.fromkeys("orange", "橘子") # 直接用字典去访问fromkeys不会对字典产生影响 ret = dict.fromkeys("abc",["哈哈","呵呵", "吼吼"]) # fromkeys直接使用类名进行访问 print(ret) >>> {'a': ['哈哈', '呵呵', '吼吼'], 'b': ['哈哈', '呵呵', '吼吼'], 'c': ['哈哈', '呵呵', '吼吼']} a = ["哈哈","呵呵", "吼吼"] ret = dict.fromkeys("abc", a) # fromkeys直接使用类名进行访问 a.append("嘻嘻") print(ret) >>> {'a': ['哈哈', '呵呵', '吼吼', '嘻嘻'], 'b': ['哈哈', '呵呵', '吼吼', '嘻嘻'], 'c': ['哈哈', '呵呵', '吼吼', '嘻嘻']}
set集合
特点:无顺序,不重复,里面元素是可哈希(不可变)的
作用:用来去重
本身是可变的数据类型,有增删改查操作
frozenset()冻结的集合. 不可变的. 可哈希的,冻结后集合不能再添加或删除任何元素。
s = {"周杰伦", "的老婆","叫昆凌", (1,2,3), "周杰伦"} lst = [11,5,4,1,2,5,4,1,25,2,1,4,5,5] s = set(lst) # 把列表转换成集合. 进行去重复 lst = list(s) # 把集合转换回列表. print(lst) >>> [1, 2, 4, 5, 11, 25] #去重 # 集合本身是可变的数据类型, 不可哈希, 有增删改查操作 s = {"刘嘉玲", '关之琳', "王祖贤"} s.update("麻花藤") # 迭代更新 无序 print(s) >>> {'王祖贤', '关之琳', '藤', '花', '刘嘉玲', '麻'}
深浅拷贝
赋值, 没有创建新对象. 共用同一个对象,他们是相同的,赋值后的变量指向原有的内存地址
浅拷贝.
拷贝第一层内容.不拷贝内部子对象,用 [:]或copy()
lst1 = ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]] print(lst1.copy()) #浅拷贝 拷贝出来的列表第一层与原来是不同的内存地址,第二层指向原来的地址 >>> ['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若']] print(lst1[:]) #浅拷贝 >>> ['金毛狮王', '紫衫龙王', '青翼蝠王', '白眉鹰王', ['张无忌', '赵敏', '周芷若']]
深拷贝.
拷贝所有内容. 包括内部的所有,形成一个新的对象,虽然与之前的值和内容一模一样,但是它们完完全全的两个对象,用deepcopy()
lst1 = ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]] lst2 = copy.deepcopy(lst1) print(lst2) >>> ["金毛狮王", "紫衫龙王", "青翼蝠王", "白眉鹰王",["张无忌","赵敏","周芷若"]] print(id(lst1)) >>> 358961124936 print(id(lst2)) >>> 358961315656 # lst1和lst2 是两个不同内存地址的