set集合,深浅拷贝

1集合set

1.1 概述

集合是无序的,不重复的数据类型,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希的。(所以集合做不了字典的key)

1.2 去重

把以个列表变成一个集合就自动去重了
关系测试:测试两组数据之前的交集,差集,并集等关系。

集合的创建

set1 = set({1,2,'barry'})
set2 = {1,2,'barry'}
set3 = set()

集合的增:

set1 = {'周杰伦','昆凌','张柏芝'}
set1.add('谢霆锋')
print(set1)
>>>{'昆凌', '谢霆锋', '张柏芝', '周杰伦'}

集合的删:

set1 = {'周杰伦','昆凌','张柏芝'}
set1.remove('周杰伦') #删除指定元素
print(set1)
>>>{'昆凌','张柏芝'}

set1.pop() #随机删除一个元素
print(set1)

set1.clear() #清空集合

del set1 #删除集合

 

1.3 集合的其他操作

交集。(& 或者 intersection)

set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7,8}
print(set1 & set2)
print(set1.intersection(set2))
>>> {3, 4, 5}
>>>    {3, 4, 5}

 

并集。(|或者union)

set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7,8}
print(set1 | set2)
print(set1.union(set2))
>>> {1, 2, 3, 4, 5, 6, 7, 8}
>>>    {1, 2, 3, 4, 5, 6, 7, 8}

 

差集。(-或者difference)

set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7,8}
print(set1 - set2)
print(set1.symmetric_difference(set2))
>>>{1,2}
>>>{1,2}

 

反交集. (^ 或者 symmetric_difference)

set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}
print(set1 ^ set2)
print(set1.symmetric_difference(set2))
>>> {1,2,6,7}
>>> {1,2,6,7}

 

子集与超集.

set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
print(set1 < set2) 
print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。
>>>True
>>>True
print(set2 > set1)
print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。
>>>True
>>>True

 

frozenset不可变集合,让集合变成不可变类型。

s = frozenset({1,2,3,4,5,1,2,3})
print(s,type(s))
>>> frozenset({1, 2, 3, 4, 5}) <class 'frozenset'>

 

2 深浅拷贝

copy一词是音译过来的,意思就复制,什么是浅拷贝?复制第一层的元素,或者说复制部分元素,
什么是深拷贝?复制全部元素。用id()来查看内存地址,如果两个变量的内存地址相同,那说名两个变量是同一个。

2.1先看赋值运算

list1 = [1,2,3,['a','b']]
list2 = list1
#用id来查看两个变量的内存地址
print(id(list1),id(list2))
#此时两个元素的内存地址完全相同,如对其中任意0.一个变量进行修改,则两个都会改变
>>>2632658608840 2632658608840
list1[3].append('c')
print(list1,list2)
>>>[1, 2, 3, ['a', 'b', 'c']] [1, 2, 3, ['a', 'b', 'c']]

 

对于赋值运算来说,list1与list2指向的是同一个内存地址,所以他们是完全一样的,在举个例子,
比如张三李四合租在一起,那么对于客厅来说,他们是公用的,张三可以用,李四也可以用,
但是突然有一天张三把客厅的的电视换成投影了,那么李四使用客厅时,想看电视没有了,而是投影了
,对吧?list1,list2指向的是同一个列表,任何一个变量对列表进行改变,剩下那个变量在使用列表之后,这个列表就是发生改变之后的列表。

2.2浅拷贝copy

list1 = [1,2,3,['a','b']]
list2 = list1.copy()
print(id(list1),id(list2))
print(list1,list2)
#此时可以看到,两个变量值相同,但是id内存地址是不一样的,所以说对其中任意元素的修改都会互不干扰
>>>2075161748168 2075162999368
>>>[1, 2, 3, ['a', 'b']] [1, 2, 3, ['a', 'b']]
lis1.append(4)
print(list1,list2)
>>>[1, 2, 3, ['a', 'b'], 4] [1, 2, 3, ['a', 'b']]
#前文提到浅拷贝copy的是第一层,下面查看列表里面嵌套的列表id
print(id(list1[3]),id(list2[3]))
#此时可以看到,浅拷贝对列表里面嵌套的列表没有copy,内存地址相同,也就是说对嵌套的列表进行操作,两个都会同时改变
>>>1792729309832 1792729309832
list1[3].append('c')
print(lis1,list2)
>>>[1, 2, 3, ['a', 'b', 'c'], 4] [1, 2, 3, ['a', 'b', 'c']]

 

3.3深拷贝

#需要引入copy模块
import copy
list1 = [1,2,3,['a','b']]
list2 = copy.deepcopy(list1)
#此时list1和list2内存地址完全不同,不管是表层元素还是嵌套的元素
print(id(list1),id(list2))
print(id(list1[3]),id(list2[3]))
print(list1,list2)
#由此可见,不管是对表层元素操作,还是对嵌套元素操作,得到的都是新的,且互不干扰
>>>2922914846152 2922914754504
>>>2922914982152 2922914982472
>>>[1, 2, 3, ['a', 'b']] [1, 2, 3, ['a', 'b']]

lis1.append(4)
lis1[3].append('c')
print(list1,list2)
>>>[1, 2, 3, ['a', 'b', 'c'], 4] [1, 2, 3, ['a', 'b']]

 

#深拷贝就是完完全全复制了一份,且数据不会互相影响,因为内存不共享

 

转载于:https://www.cnblogs.com/python-info/p/11133178.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值