集合和深浅拷贝

时间:2021-06-18 19:51:22

1.集合

1.1集合的形式

1 s = set("cccdfed")        
2 print(s)

结果为:{'d', 'e', ' ', 'f', 'c'} 可以总结出:1 打印的是无重复的 2 内容时可hashed的 3 无序的 4 set本身的是不可hashed 5 set中只能是一个数据类型 若是有多个以列表等形式表现

1.2一般操作

1 print("ccc" in s1)     # 判断T OR F
2 s1.add("sb") # 添加到里面 {'ccc', 'sb', 'hesa'}
3 s1.update("dee") # {'ccc', 'd', 'hesa', 'e', 'sb'} 一个一个字母 会去重复
4 s1.remove("ccc") # 删除
5 s1.pop() # 删除 并返回
6 s1.clear()

1.3特殊操作

1.3.1交集

1 a = set([1,2,3,4])
2 b = set([3,4,5,6])
3 print(a.intersection(b)) #{3, 4}
4 print(a & b)

1.3.2并集

1 print(a.union(b))    # {1, 2, 3, 4, 5, 6}
2 print(a | b)

1.3.3补集

1 print(a.difference(b)) #{1, 2}
2 print(a - b)
3 print(b.difference(a)) #{5, 6}
4 print(b - a)
5 print(a.symmetric_difference(b)) # {1, 2, 5, 6}

1.4总结

(1) 与列表的不同在于:列表是有序的,集合是无序的。列表中可以放置其他变量,集合中不能。

(2) 与元组的不同在于:元组是不可修改的,集合中的可以修改。

(3) 通过对集合的学习可以看到集合更在与整体处理上有着明显的优势,通过对集合的特殊操作可以进行查重等。集合的出现弥补了列表字典的整体处理的缺陷。

(4)上述集合都是可变集合。

2.深浅拷贝

2.1浅拷贝

1 s = [[1,2],"alex","ccc"]
2 s1 = s.copy()
3 s1[2] = "linux"
4 print(s)
5 print(s1)
6 s1[0][1] = 3

打印结果为:s [[1,2],"alex","ccc"]

s1 [[1,2],"alex","Linux"]

在第六行中修改了s1中列表中的列表的信息,s也会受到影响。这其中道理涉及到内存的理解。先看图理解:

集合和深浅拷贝

其中b浅拷贝于a。两者的储存效果如图。

集合和深浅拷贝

可以看到的是b在改变的0088地址的时候将小列表的地址改变,a同时又受到了影响。这种影响可以是积极的也可以是无用的。

2.2深拷贝

1 import copy
2 s = [[1,2],3,4]
3 s1 = copy.deepcopy(s)
4 s1 [0][1] = 666
5 print(s)
6 print(s1)

这种拷贝方式会完全将两者分离,双方之间没有影响。