第九天,深浅拷贝,集合
理解数据在内存中存储和调用的方式,理解赋值,浅拷贝,深拷贝区别.
a=b #赋值,a指向b,修改b或a,两者皆变
a = b.copy() #浅拷贝,只拷贝第一层.
import copy
a = ['host1',123,[1000,500]]
b = copy.deepcopy(a) #深拷贝
b[0] = 'host2'
b[2][1] -= 200
print(a)
print(b)
# li = [1, 2, 'a', 'b']
# s = set(li)
# print(s) # {1, 2, 'a', 'b'}
#
# li2 = [1, 2, 1, 'a', 'a']
# s = set(li2)
# print(s) # {1, 2, 'a'}
li=[[1,2],'a','b']
s = set(li) #TypeError: unhashable type: 'list' 集合元素必须是可哈希的,不能是列表字典.类似字典的键
print(s)
集合分类:可变集合、不可变集合
可变集合(set):可添加和删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素
不可变集合(frozenset):与上面恰恰相反
s1
=
set
(
'alvin'
)
s2
=
frozenset
(
'yuan'
)
print
(s1,
type
(s1))
#{'l', 'v', 'i', 'a', 'n'} <class 'set'>
print
(s2,
type
(s2))
#frozenset({'n', 'y', 'a', 'u'}) <class 'frozenset'>
访问集合
由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用in、not in来访问或判断集合元素。
s1
=
set
(
'alvin'
)
print
(
'a'
in
s1)
print
(
'b'
in
s1)
#s1[1] #TypeError: 'set' object does not support indexing
for
i
in
s1:
print
(i)
更新集合
可使用以下内建方法来更新:
s.add()
s.update()
s.remove()
注意只有可变集合才能更新:
# s1 = frozenset('alvin')
# s1.add(0) #AttributeError: 'frozenset' object has no attribute 'add'
s2
=
set
(
'alvin'
)
s2.add(
'mm'
)
print
(s2)
#{'mm', 'l', 'n', 'a', 'i', 'v'}
s2.update(
'HO'
)
#添加多个元素
print
(s2)
#{'mm', 'l', 'n', 'a', 'i', 'H', 'O', 'v'}
s2.remove(
'l'
)
print
(s2)
#{'mm', 'n', 'a', 'i', 'H', 'O', 'v'}
del:删除集合本身
del(s1) 或者del s1
s1.pop() 随机删除并返回
s1.clear() 全清
s1 = set('alvin')
s2 = frozenset('yuan')
# print(s1, type(s1)) # {'l', 'v', 'i', 'a', 'n'} <class 'set'>
# print(s2, type(s2)) # frozenset({'n', 'y', 'a', 'u'}) <class 'frozenset'>
# del(s1)
# print(s1, type(s1))
# s1.union(s2) #并集
# print(s1 | s2)#并集
# print(s1)
# print(s1&s2) #交集
# print(s1^s2) #对称差集(^)对称差分是集合的XOR(‘异或’),取得的元素属于s1,s2但不同时属于s1和s2.其等价方法symmetric_difference()
查集(-)
等价方法是difference()
s1 = set('alvin')
s2 = set('yuan')
s3 = s1 - s2 #差集
print(s3) # {'v', 'i', 'l'}
print(s1.difference(s2)) # {'v', 'i', 'l'}
s1 = set('alvin')
s2 = set('alvin01')
print(s1 < s2)#True