第九天,深浅拷贝,集合

理解数据在内存中存储和调用的方式,理解赋值,浅拷贝,深拷贝区别.

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 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
posted @ 2020-05-06 17:13  十名知花香  阅读(158)  评论(0编辑  收藏  举报