DAY7 集合,深浅copy

一.集合set

  (1)集合是无序的,不重复的数据集合,它里面的元素的类型是可哈希的(即:不可变类型),可是集合自己是可变类型,可以进行增删查操做。python

  (2)空集合的表示方法:set()面试

  (3)集合的做用:app

      1. 数据去重,把一个列表变成集合,就自动去重。测试

      2. 关系测试,测试两组数据的并集,交集,差集等...spa

   # 建立元组对象

set1 = {1,2,3,4}
print(set1)
>>> {1, 2, 3, 4}

# 集合的元素都是不可变类型,因此只能包含数值,字符串,元组。
set2 = {1,2,3,['python']}
print(set2)
>>>>>>TypeError: unhashable type: 'list'

#经过set()方法建立集合
set3 = set({1,2,3,'barry'})
print(set3)

  # 集合的操做blog

  (1)增内存

 

#谨记:集合是无序的
'''add()'''
set1 =  {'alex','wusir','evj','taibai'}
set1.add('he')
print(set1)
>>>{'he', 'alex', 'evj', 'wusir', 'taibai'}

'''update():把可迭代对象的元素分别增长'''
set1 =  {'alex','wusir','evj','taibai'}
set1.update('A')
print(set1)
>>>{'alex', 'taibai', 'A', 'evj', 'wusir'}

set1.update('老师')
print(set1)
>>> {'taibai', '老', 'wusir', 'evj', '师', 'alex'}

set1.update([1,2,3])
print(set1)
>>> {1, 'wusir', 2, 3, 'evj', 'alex', 'taibai'}

 

  (2)删element

'''remove(element):删除一个元素,若是不存在,则报错'''
set1 =  {'alex','wusir','evj','taibai'}
set1.remove('alex')
set1.remove('he')   #元素不存在,则会报错
>>>KeyError: 'he'
print(set1)

'''pop():随机删除一个元素,并返回此元素'''
set1 =  {'alex','wusir','evj','taibai'}
res=set1.pop()
print(res)
print(set1)

'''clear():清空集合,保留集合自己'''
set1 =  {'alex','wusir','evj','taibai'}
set1.clear()
print(set1)
>>> set()        #谨记:空集合的写法为:set()

'''del语句 在内存级别删除集合自己'''
set1 =  {'alex','wusir','evj','taibai'}
del set1
print(set1)

 

  (3)集合的关系测试rem

 

#并集(| 或 union)
set1 = {1,2,3}
set2 = {4,5}
set3 = set1 | set2
print(set3)
set3 = set1.union(set2)
print(set3)

# 交集(& 或 intersection)
set1 = {1,2,3}
set2 = {3,4}
set3 = set1 & set2
print(set3)


# 反交集(^ 或 symmetric_difference)
set1 = {1,2,3}
set2 = {3,4}
set3 = set1.symmetric_difference(set2)
print(set3)


# 差集(- 或者 difference)
set1 = {1,2,3,4,5}
set2 = {1,2,3}
set3 = set1 - set2
print(set3)
set3 = set1.difference(set2)
print(set3)

#子集 <, issubset()
set1 = {1,2,3,4,5}
set2 = {1,2,3}
print(set2 < set1)
print(set2.issubset(set1))

#超集 >,issuperset()
 

 

 

 

二.深浅copy详解

事前须知:赋值的含义

l1 = [1,2,3]
l2 = l1
l1.append(666)
print(l2)
print(id(l1))
print(id(l2))
>>>
[1, 2, 3, 666]
2153377571720     
2153377571720    #证实l1,l2在内存中指向的是同一个地址。因此l1改变,L2也会变。

(1)浅copy

l1 = [1,2,3]
l2 = l1.copy() l1.append(666) print(l1) print(l2) >>> [1, 2, 3, 666] [1, 2, 3] ****从上面的代码看,好像没有太大问题,接着往下看,神奇的事情发生了****
l1 = [1,2,3,[22]] l2 = l1.copy() l1[-1].append(666) print(l1) >>>[1, 2, 3, [22, 666]] print(l2) >>>[1, 2, 3, [22, 666]] print(id(l1)) print(id(l2)) print(id(l1[0])) print(id(l2[0])) print(id(l1[-1])) print(id(l2[-1])) >>> 2233198322568 2233199144648 1964990688 1964990688 2233198322696 2233198322696

 总结:

   浅copy只是在第一层的内存地址是不一样的,从第二层开始以及更深层,都是共用的一个内存地址。

 

(2)深copy

# 深copy须要用到copy模块中的deepcopy()方法
import copy
l1 = [1,2,3,[22]]
l2 = copy.deepcopy(l1)    
l1.append(666)
print(l1)
print(l2)
>>>
[1, 2, 3, [22], 666]
[1, 2, 3, [22]]


import copy
l1 = [1,2,3,[22]]
l2 = copy.deepcopy(l1)
l1[-1].append(666)
print(l1)
print(l2)
>>>
[1, 2, 3, [22, 666]]
[1, 2, 3, [22]]

print(id(l1))
print(id(l2))
print(id(l1[-1]))
print(id(l2[-1]))
>>>

1590872594312
1590872595592
1590872594120
1590872595528

总结:

  深copy的两个对象之间是彻底独立的关系,两个对象的内存地址彻底不同。

(3)应用场景:

  1.彻底独立的copy一份数据,与原数据没有关系,就使用深copy。

  2.若是有一份数据的第二层想与原数据进行共有,就使用浅copy。

(4)面试题:

  一.解释深浅copy的含义。

  二.彻底切片[:]属于浅copy

 

l1 = [1,2,3,[22,33]]
l2 = l1[:]
# l1.append(66)
# print(l1)
# print(l2)

l1[-1].append(66)
print(l1)>>> [1,2,3,[22,33,66]]
print(l2)>>> [1,2,3,[22,33,66]]
相关文章
相关标签/搜索