Python自学之路之day06-基本数据集合
一、集合
set集合是python的一个基本数据类型. ⼀般不是很常⽤. set中的元素是不重复的.⽆序的.⾥面的元素必须是可hash的(int, str, tuple,bool), 我们可以这样来记. set就是dict类型的数据但是不保存value, 只保存key. set也⽤{}表⽰。
1、 set集合中的元素必须是可hash的, 但是set本身是不可hash的. set是可变的
## 不合法集合 set1 = {'1','abc',2,True,[1,2,3]} # 报错 set2 = {'1','tchua',2,True,{1:2}} # 报错 set3 = {'1','tchua',2,True,(1,2,[2,3,4])} # 报错
2、集合是无序且不能重复的
s1 = {1,2,2,"huahua","huahua"}
print(s1)
打印结果:
{1, 2, 'huahua'}
3、集合常用操作
# 增加 s1 = {"tchua","流浪",1} s1.add("光辉") print(s1) ## 重复内容不会添加到集合中 s1.add("流浪") ## 迭代增加 s1 = {"tchua","流浪",1} s1.update("光辉") 打印结果: {1, '辉', 'tchua', '流浪', '光'} # 删 ## pop 返回删除的值 s1 = {"tchua","流浪",1} s2 = s1.pop() print(s1) print(s2) ## remove 直接删除元素,元素不存在,则报错 s1 = {"tchua","流浪",1} s1.remove("tchua") print(s1) ## clear 清空集合 s1 = {"tchua","流浪",1} s1.clear() print(s1) 打印结果: set() # 修改 set集合中的数据没有索引. 也没有办法去定位⼀一个元素. 所以没有办法进⾏行行直接修改,如果想要修改,可以采用先删除后添加的⽅式来完成修改操作 ## 流浪修改为光辉 s1 = {"tchua","流浪",1} s1.remove("流浪") s1.add("光辉") print(s1)
4、集合运算
# 交集 s1 = {"刘能", "赵四", "李珊"} s2 = {"刘科⻓长", "冯乡长", "李珊"} print(s1 & s2) print(s1.intersection(s2)) # 并集 s1 = {"刘能", "赵四", "李珊"} s2 = {"刘科⻓长", "冯乡长", "李珊"} print(s1 | s2) print(s1.union(s2)) # 差集 s1 = {"刘能", "赵四", "李珊"} s2 = {"刘科⻓长", "冯乡长", "李珊"} print(s1 - s2) print(s1.difference(s2)) # 子集 返回True或者False print(s1 < s2) print(s1.issubset(s2))
# 超集 返回True或者False
print(s1 > s2)
print(s1.issuperset(s2))
二、深浅COPY
lst1 = ["流浪","光辉","德玛"] lst2 = lst1 print(lst1) print(lst2) 打印结果: ['流浪', '光辉', '德玛'] ['流浪', '光辉', '德玛'] lst1.append("皇子") print(lst1) print(lst2) 打印结果: ['流浪', '光辉', '德玛', '皇子'] ['流浪', '光辉', '德玛', '皇子'] 总结:于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 所以. lst1的内存指向和lst2是一样的. lst1改变了, lst2也发⽣生了改变
1、浅拷贝
lst1 = ["流浪","光辉","德玛","狐狸"] lst2 = lst1.copy() print("第一次打印:",lst1,lst2) lst1.append("亚索") print("第二次打印:",lst1,lst2) 打印结果: 第一次打印: ['流浪', '光辉', '德玛', '狐狸'] ['流浪', '光辉', '德玛', '狐狸'] 第二次打印: ['流浪', '光辉', '德玛', '狐狸', '亚索'] ['流浪', '光辉', '德玛', '狐狸'] 结论: 我们发现第一次lst1与lst2的值是一样的,但是内存地址却不一样,当我们修改lst1时,并不会影响lst2。浅copy会重新开辟一块内存地址,与之前内容虽然一样,但是内存地址指向不一样,所以不相互影响。
lst1 = ["流浪","光辉","德玛",["法师","中路"]]
lst2 = lst1.copy()
lst1[3].append("AD")
print(lst1)
print(lst2)
print(id(lst1[3]),id(lst2[3]))
打印结果:
['流浪', '光辉', '德玛', ['法师', '中路', 'AD']]
['流浪', '光辉', '德玛', ['法师', '中路', 'AD']]
2366773349256 2366773349256
结论:
当有多层时,浅copy只会copy第一层,内层的内容指向的内存地址一样,所以修改其中一个,另一个也会变,这就是浅copy的特性。
2、深拷贝
深copy需要借助copy模块
import copy lst1 = ["流浪","光辉","德玛",["法师","中路"]] lst2 = copy.deepcopy(lst1) lst1[3].append("AD") print(lst1) print(lst2) print(id(lst1[3]),id(lst2[3])) 打印结果: ['流浪', '光辉', '德玛', ['法师', '中路', 'AD']] ['流浪', '光辉', '德玛', ['法师', '中路']] 2454014970440 2454014971400 结论: 可以看到,lst1与lst2值和内存地址都不一样了。深度拷贝就是把元素内部的元素完全进⾏拷⻉复制. 不会产⽣一个改变另⼀个跟着改变的问题

浙公网安备 33010602011771号