python 深浅拷贝&集合
一、深浅拷贝
1.浅拷贝,只会拷贝第一层
s = [1, 'ss', '小可爱'] s1 = s.copy() print(s1)
>>>
[1, 'ss', '小可爱']
s = [1, 'ss', '小可爱'] s1 = s.copy() s1[0] = 3 #修改s1的值 print(s1)
>>>
[3, 'ss', '小可爱']
#浅拷贝,只会拷贝第一层,修改完s1里面列表的值后,数据源也会改变 s = [[1, 2], 'ss', '小可爱'] s1 = s.copy() s1[0][1] = 3 #修改s1的值 print(s1) print(s)
>>>
[[1, 3], 'ss', '小可爱']
[[1, 3], 'ss', '小可爱']
2.深拷贝 = 克隆一份
import copy s = [[1, 2], 'ss', '小可爱'] s1 = copy.deepcopy(s) s1[0][1] = 3 #修改s1的值 print(s) print(s1)
>>>
[[1, 2], 'ss', '小可爱'] [[1, 3], 'ss', '小可爱']
二、集合:
把不同的元素集合到一起,组成集合的成员不可重复如果有重复的元素保留一个
主要作用:
1.去重,把一个列表变成集合就自动去重了;
2.关系测试,交集、并集等关系
集合的创建:
a = set('xiaoss baby')
print(a) # 输出:{'a', 'y', 'b', 'o', 'x', ' ', 'i', 's'}
分类:可变集合、不可变集合
可变集合(set):可添加和删除元素,非可哈希的,不能做字典的键和其他集合的元素
不可变集合(frozenset):与上相反
基本操作:
li = ['xiao', 2, 5] s = set(li) s.add('baby') #添加一个元素 print(s) s.update('ops') # 把要添加的字符串作为一个单独的序列加到集合里 print(s)
>>>
{2, 'xiao', 'baby', 5} {2, 5, 'o', 'baby', 'p', 'xiao', 's'}
li = ['xiao', 2, 5] s = set(li) s.update('ooo') # 重复的字符只添加一个到集合里 print(s)
>>>
{'o', 2, 'xiao', 5}
li = ['xiao', 2, 5] s = set(li) s.update([12, 'baby']) # 添加多个元素要放到一个容器里 print(s)
>>>
{2, 5, 'baby', 12, 'xiao'}
#删除操作
li = ['xi', 2, 5] s = set(li) # 删除 s.remove(2) # ()里存放要删除的内容 s.pop() # 随机删除一个 s.clear() # 清空 del s # 直接删除整个集合 print(s)
>>>
print(set('qwer') == set('qwereq')) # True 因为两者形成的集合结果一样,所以等价 print(set('qwer') < set('qwerty')) #True < 表示后者包含前者
>>>
True True
# 联合操作 print(set('qwer') or set('qwerty')) # 取两者共同的 print(set('qwer') and set('qwerty')) # 取两者包含的所有序列元素
>>>
{'w', 'e', 'q', 'r'} {'w', 'y', 'r', 't', 'e', 'q'}
a = set([1, 2, 3, 4, 5]) b = set([3, 4, 5, 6, 7]) # intersection() 交集 print(a.intersection(b)) print(a & b) #同上 #union 并集 print(a.union(b)) print(a | b) #同上 # 差集(互相不在对方里面) print(a.difference(b)) # 在a不在b 或print(a - b) print(b.difference(a)) # 在b不在a 或print(b - a) # 反向交集 print(a.symmetric_difference(b)) # 父集 print(a.issuperset(b)) # 判断a是否完全包含于b # 子集 print(a.issubset(b))
>>>
{3, 4, 5} {3, 4, 5} {1, 2, 3, 4, 5, 6, 7} {1, 2, 3, 4, 5, 6, 7} {1, 2} {6, 7} {1, 2, 6, 7} False False