python---集合及深浅copy
一、集合
相信大家都在数学中接触过集合,在python中集合也是有这相同的性质,1、去重,集合会将内部元素自定去重
2、关系测试,类似数学中的交集并集子集一样
1.1如何创建集合
集合在python中的用的符号也是{}和字典的一样,但是内部元素是单独存在而不是键值对的方式
set = {1,2,3,4,5} set1 = {1,2,3,4,5,2,2,2,2} #自动去重 print(set,set1) #运行结果: {1,2,3,4,5} {1,2,3,4,5}
1、集合的增
#add 追加元素
set = {1,2,3,5} set.add('kingfan') print(set) #运行结果: {1, 2, 3, 5, 'kingfan'}
#updata迭代增加
set.update(['a','b','c'])
print(set)
#运行结果:
{1, 2, 3, 5, 'a', 'b', 'kingfan', 'c'}
2、删
#remove 按元素删除 set = {1,2,3,4,'a',6,7} set.remove('a') #pop 随机删除 set.pop() #clear清空 set.clear() #del set 从内存上删除 del set
2、集合的关系测试
1、交集
set = {1,2,3,4,'a',6,7} set1 = {2,3,4,8,9} print(set&set1) #{2, 3, 4} print(set.intersection(set1)) #{2, 3, 4}
2、并集
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7} print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7}
3、差集
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 - set2) # {1, 2, 3} print(set1.difference(set2)) # {1, 2, 3}
4、反交集
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1 ^ set2) # {1, 2, 3, 6, 7, 8} print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8}
4、子集与超集
set1 = {1,2,3} set2 = {1,2,3,4,5,6} print(set1 < set2) print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。 print(set2 > set1) print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。
二、深浅copy
关于深浅copy大家先看下面的列子:
l1 = [1,2,3,4,5] l2 = l1.copy() l1[0] = 2 print(l1,l2) #运行结果: [2, 2, 3, 4, 5] [1, 2, 3, 4, 5]
l1 = [1,2,3,[4,5]]
l2 = l1.copy()
l1[3][0] = 2
print(l1,l2)
#运行结果:
[1, 2, 3, [2, 5]] [1, 2, 3, [2, 5]]
可以看出第一个列子在l2浅copy之后,l1修改第一层参数并不会对l2造成影响,而第二个例子中,l1修改来了子列表中的元素后l2也随之改了。对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
如果想完全独立开与被复制对象的关系则需要引用模块也就是深copy功能:
l1 = [1,2,3,[4,5]] l2 = copy.deepcopy(l1) l1[3][0] = 2 print(l1,l2) #运行结果: [1, 2, 3, [2, 5]] [1, 2, 3, [4, 5]]
这样就完全独立开了