python---集合及深浅copy

一、集合

  相信大家都在数学中接触过集合,在python中集合也是有这相同的性质,1、去重,集合会将内部元素自定去重

2、关系测试,类似数学中的交集并集子集一样

1.1如何创建集合

   集合在python中的用的符号也是{}和字典的一样,但是内部元素是单独存在而不是键值对的方式

set = {1,2,3,4,5}
set1 = {1,2,3,4,5,2,2,2,2}  #自动去重
print(set,set1)
#运行结果:
{1,2,3,4,5}
{1,2,3,4,5}

1、集合的增

#add 追加元素
set = {1,2,3,5} set.add('kingfan') print(set) #运行结果: {1, 2, 3, 5, 'kingfan'}

#updata迭代增加
set.update(['a','b','c'])
print(set)
#运行结果:
{1, 2, 3, 5, 'a', 'b', 'kingfan', 'c'}

2、删

#remove 按元素删除
set = {1,2,3,4,'a',6,7}
set.remove('a')

#pop 随机删除
set.pop()

#clear清空
set.clear()

#del set 从内存上删除
del set

2、集合的关系测试

1、交集

set = {1,2,3,4,'a',6,7}
set1 = {2,3,4,8,9}
print(set&set1)        #{2, 3, 4}
print(set.intersection(set1))    #{2, 3, 4}

2、并集

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

print(set2.union(set1))  # {1, 2, 3, 4, 5, 6, 7}

3、差集

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

4、反交集

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

4、子集与超集

set1 = {1,2,3}
set2 = {1,2,3,4,5,6}

print(set1 < set2)
print(set1.issubset(set2))  # 这两个相同,都是说明set1是set2子集。

print(set2 > set1)
print(set2.issuperset(set1))  # 这两个相同,都是说明set2是set1超集。

 二、深浅copy

  关于深浅copy大家先看下面的列子:

l1 = [1,2,3,4,5]
l2 = l1.copy()
l1[0] = 2
print(l1,l2)
#运行结果:
[2, 2, 3, 4, 5] [1, 2, 3, 4, 5]



l1 = [1,2,3,[4,5]]
l2 = l1.copy()
l1[3][0] = 2
print(l1,l2)
#运行结果:
[1, 2, 3, [2, 5]] [1, 2, 3, [2, 5]]

 

可以看出第一个列子在l2浅copy之后,l1修改第一层参数并不会对l2造成影响,而第二个例子中,l1修改来了子列表中的元素后l2也随之改了。对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。

  如果想完全独立开与被复制对象的关系则需要引用模块也就是深copy功能:

l1 = [1,2,3,[4,5]]
l2 = copy.deepcopy(l1)
l1[3][0] = 2
print(l1,l2)
#运行结果:
[1, 2, 3, [2, 5]] [1, 2, 3, [4, 5]]

 

 这样就完全独立开了

posted @ 2018-08-20 21:10  Kingfan  阅读(240)  评论(0编辑  收藏  举报