python-- 深浅copy集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-- 深浅copy集合相关的知识,希望对你有一定的参考价值。

深浅copy

1、数字、字符串的copy:

赋值(=)、浅拷贝(copy)和深拷贝(deepcopy)其实都一样,因为它们永远指向同一个内存地址:

技术分享
>>> import copy
>>> n1 = 123
>>> print(id(n1))  #打印n1的内存地址
502665488
##赋值##
>>> n2 = n1
>>> print(id(n2))
502665488
##浅拷贝##
>>> n3 = copy.copy(n1)
>>> print(id(n3))
502665488
##深拷贝##
>>> n4 = copy.deepcopy(n1)
>>> print(id(n4))
502665488
View Code

技术分享

 2、列表、元组、字典copy:

赋值(=)

赋值只是创建一个变量,该变量指向原来的内存地址

技术分享
>>> name1 = [a,b,[m,n],c]
>>> name2 = name1
#输出结果,两个内存地址是一样的
>>> print(id(name1),,,id(name2))
50077256 , 50077256
View Code

 

 

浅copy:

浅拷贝是指在内存地址中,只拷贝出第一层的内存的地址中的内容形成一个新的地址,第二层还是共用同一个内存地址:

技术分享
>>> import copy
>>> name1 = [a,b,[m,n],c]
#浅copy
>>> name2 = copy.copy(name1)
>>> print(name1,,,id(name1))
[a, b, [m, n], c] , 50228296
>>> print(name2,,,id(name2))
[a, b, [m, n], c] , 50920008
#修改列表中的元素
>>> name1[0] = h
>>> name1[2][0] = M
>>> print(name1,,,id(name1))
[h, b, [M, n], c] , 50228296
>>> print(name2,,,id(name2))
[a, b, [M, n], c] , 50920008
View Code

 

深copy:

浅拷贝是指在内存地址中,拷贝name1第一层和第二层内存地址中的内容形成一个name2的两个新内存地址,两者内存地址不一致,所以无交集

技术分享
>>> import copy
>>> name1 = [a,b,[m,n],c]
#深拷贝
>>> name2 = copy.deepcopy(name1)
>>> print(name1,,,id(name1))
[a, b, [m, n], c] , 50142472
>>> print(name2,,,id(name2))
[a, b, [m, n], c] , 50942280
>>> name1[0] = h
>>> name1[2][0] = M
>>> print(name1,id(name1),id(name1[2][0]))
[h, b, [M, n], c] 50142472 10937320
>>> print(name2,id(name2),id(name2[2][0]))
[a, b, [m, n], c] 50942280 4896280
View Code

 

 

集合

集合是无序的,天生不重复的数据组合,它的作用如下:

  • 去重,即:把一个列表变成集合,就去重了
  • 关系测试,即:测试两组集合的交集、并集和差集等
>>> name_1 = [1,2,3,4,7,8,7,10]
#把列表转换为集合
>>> name_1 = set(name_1)
#转换后,去重
>>> print(name_1,type(name_1))
{1, 2, 3, 4, 7, 8, 10} <class set>

 

一、关系测试:

1、交集(intersection())、交集(&)

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
#输出结果
>>> name_1.intersection(name_2) # name_1 & name_2
{8, 1, 10, 3}

 

2、并集(union())、并集(|)

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
#输出结果
>>> name_1.union(name_2)# name_1 | name_2
{1, 2, 3, 4, 5, 7, 8, 10}

 

 

 3、差集(difference())、差级(-)

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
#输出结果
>>> name_1.difference(name_2) #name_1 - name_2
{2, 4, 7}

 

 注:差集取的是数值在第一个集合中,但是不在第二个集合中(在我不在你)

4、对称差集(symmetric_difference())、对称差集(^)

 把两个集合没有交集的数值取出来

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
#输出结果
>>> name_1.symmetric_difference(name_2) #name_1 ^ name_2
{2, 4, 5, 7}

 

5、issubset()、是否是子集(<=)

判断一个集合是否是另一个集合的子集

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_3 = [1,2,3,4]
>>> name_1 = set(name_1)
>>> name_3 = set(name_3)
#输出结果
>>> name_3.issubset(name_1) # name_3 <= name_1
True

 

 6、issuperset()、是否是父集(>=)

判断一个集合是否是另一个集合的父集

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_3 = [1,2,3,4]
>>> name_1 = set(name_1)
>>> name_3 = set(name_3)
#输出结果
>>> name_1.issuperset(name_3)# name_1 >= name_3
True 

 

 7、isdisjoint()、

判断两个集合是否有交集,没有交集,则返回True

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_2 = [1,3,5,8,10]
>>> name_3 = [11]
>>> name_1 = set(name_1)
>>> name_2 = set(name_2)
>>> name_3 = set(name_3)
#有交集
>>> name_1.isdisjoint(name_2)
False
#无交集
>>> name_1.isdisjoint(name_3)
True

二、 集合基本操作(增删改查)

添加(add())
>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
#添加已存在,不报错
>>> name_2.add(1)
>>> name_2
{8, 1, 10, 3, 5}
#添加不存在,添加一个新的数值
>>> name_2.add(11)
>>> name_2
{1, 3, 5, 8, 10, 11}

######################################
 
添加多项(update())

>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
>>> name_2.update([12,13,14])
#输出结果
>>> name_2
{1, 3, 5, 8, 10, 12, 13, 14}

######################################
 删除(remove(),pop(),discard())

#1、remove()

>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
>>> name_2
{8, 1, 10, 3, 5}
>>> name_2.remove(1)
#输出
>>> name_2
{8, 10, 3, 5}
#删除不存在的元素,会报错
>>> name_2.remove(1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: 1
 注:用remove删除时,当元素不存在,会报错

#2、pop()

>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
>>> name_2
{8, 1, 10, 3, 5}
#输出
>>> name_2.pop()
8
 注:pop是随机删除集合中的某个元素,并且打印

#3 discard()

>>> name_2 = [1,3,5,8,10]
>>> name_2 = set(name_2)
>>> name_2.discard(10)
#输出结果
>>> name_2
{8, 1, 3, 5}
#删除不存在元素,不报错
>>> name_2.discard(10)
注:用discard删除不存在的元素,不会出现报错

######################################

长度(len())

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_1 = set(name_1)
#结果输出
>>> len(name_1)
7

######################################
 
#x in s

测试 x 是否是 s 的成员

>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_1 = set(name_1)
#结果输出
>>> 1 in name_1
True

######################################

x not in s

测试 x 是否不是 s 的成员


>>> name_1 = [1,2,3,4,7,8,7,10]
>>> name_1 = set(name_1)
#输出
>>> 12 not in name_1
True

 

以上是关于python-- 深浅copy集合的主要内容,如果未能解决你的问题,请参考以下文章

python-- 深浅copy集合

python之集合深浅copy文件操作函数初识

Python的深浅copy

python--集合深浅copy

python集合深浅copy

骑士计划-python全栈07 集合,深浅copy(copy,deepcopy)