3.26 集合以及深浅copy
集合与深浅拷贝
集合
set集合数据类型:无序、不重复,里面的元素是可哈希(str、int、tuple、bool)的,集合本身不可哈希,不可作为字典的键。。。
-
作用
- 去重
- 判断数据关系
-
集合的增删查
-
增
-
set.add()
-
set.update()集合的迭代添加
-
-
删
-
set.remove() 按元素删
-
set.pop()有返回值,返回被删除的元素
- set.clear():空集合表示:set()
- del set
- 查
- 只有for循环查阅
-
集合的交集、并集
-
交集
-
set1 & set2
-
set1.intersection(set2)
-
-
-
-
反交集
-
-
set1 ^ set2
-
set1.symmetric_difference(set2)
-
-
-
并集
-
set1 | set2
-
set1.union(set2)
-
-
差集
-
set1 - set2
-
-
子集与超集
-
set1.issubset(set2):判断set1是否是set2的子集;
-
set2.issuperset(set1): 判断set2是否是set1的超集;
-
-
-
-
frozenset
-
frozenset是不可变类型,属于可哈希。可以做字典的键。。
-
-
1 {'a': 'alex', 'b': 'alex', 'c': 'alex'} 2 {1: [], 2: [], 3: []} 3 {1: ['老男孩'], 2: ['老男孩'], 3: ['老男孩']}
frozenset({'barry', 'wusir'}) <class 'frozenset'> #### class(frozenset)不可变 可哈希
深浅copy
-
-
copy:不同于赋值运算,不是在内存中指向一个内存,而是在内存中重新开辟了一个新的内存空间。而对于赋值运算,指向的是内存中的同一位置。
-
-
-
浅copy
-
-
第一层创建的是一个新内存空间,从二层开始,使用的是同一个内存地址。也就是只copy了一层新的关系。所以说对于第二层以及更深的层次来说,保持一致性。
-
-
-
1 l1 = [1,2,[1,2,3,[22,33,44]],4] 2 l2 = l1.copy() 3 l1[2].append(666) 4 print(l1) 5 print(l2)
输出结果:
1 [1, 2, [1, 2, 3, [22, 33, 44], 666], 4] 2 [1, 2, [1, 2, 3, [22, 33, 44], 666], 4] ###浅copy,只在第一层创建了一个新的内存地址。第二层还是保持跟被copy的一样的内存地址
-
-
深copy
-
对于深copy来说,两个个体是相互独立的。改变一个的元素,另一个保持不变。
-
-
1 import copy 2 l1 = [1, 2, [1, 2, 3], 4] 3 l2 = copy.deepcopy(l1) 4 l1[2].append(666) 5 print(l1,l2) 6 print(id(l1[2]),id(l2[2]))
输出结果:
1 [1, 2, [1, 2, 3, 666], 4] [1, 2, [1, 2, 3], 4] ### 深copy,两个列表相互独立。 2 42041480 42042888
-
-
- 切片算浅copy
-
1 l1 = [1,2,3,[22,33]] 2 l2 = l1[:] 3 l1[3].append(666) 4 print(l2) # [1, 2, 3, [22, 33, 666]]
输出结果:
[1, 2, 3, [22, 33, 666]] ###浅copy
浙公网安备 33010602011771号