python基础—day7 深度拷贝与集合

深度拷贝

  • 直接赋值:其实就是对象的引用(别名)。

  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

字典浅拷贝实例

实例

>>>a = {1: [1,2,3]} >>> b = a.copy() >>> a, b ({1: [1, 2, 3]}, {1: [1, 2, 3]}) >>> a[1].append(4) >>> a, b ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})

深度拷贝需要引入 copy 模块:

实例

import copy
c = copy.deepcopy(a)
a, c ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
a[1].append(5)
a, c ({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})
 

1、b = a: 赋值引用,a 和 b 都指向同一个对象。

2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

实例

以下实例是使用 copy 模块的 copy.copy( 浅拷贝 )和(copy.deepcopy ):

# -*-coding:utf-8 -*-

import copy a = [1, 2, 3, 4, ['a', 'b']]

#原始对象 b = a #赋值,传对象的引用

c = copy.copy(a)

#对象拷贝,浅拷贝 d = copy.deepcopy(a) #对象拷贝,深拷贝

a.append(5)

#修改对象a

a[4].append('c')

#修改对象a中的['a', 'b']数组对象

print( 'a = ', a ) print( 'b = ', b )

print( 'c = ', c ) print( 'd = ', d )

 

a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']]

 

 

集合——元素之间不允许重复

集合的创建

集合(set)是一个无序的不重复元素序列。

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典

 

s1 = set(('apple', 'orange', 'apple', 'pear', 'orange', 'banana'))
print(s1)
s2={'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(s2)
#{'orange', 'banana', 'apple', 'pear'}
#集合不允许重复
t3 ={1,11,1,1,2,3,4,5,6,7,7}
print(s3)
#{1, 2, 3, 4, 5, 6, 7, 11}

 

#空集合
s={}
print(type(s))
<class 'dict'>
s1=set()
print(type(s1))
<class 'set'>

 

集合的基本操作

1、添加元素

语法格式如下:

s.add( x )

将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。

thisset = set(("Google", "Runoob", "Taobao"))
thisset.add("Facebook")
print(thisset)
#{'Taobao', 'Facebook', 'Google', 'Runoob'}

 

 

s.update( x )

也可以添加元素,且参数可以是列表,元组,字典等,语法格式如下:

thisset = set(("Google", "Runoob", "Taobao"))
thisset.update({1,3})
print(thisset)
#{1, 3, 'Google', 'Taobao', 'Runoob'}
thisset.update([1,4],[5,6])
print(thisset)
#{1, 3, 4, 5, 6, 'Google', 'Taobao', 'Runoob'}

 

2、移除元素

语法格式如下:

s.remove( x )

将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误

thisset = set(("Google", "Runoob", "Taobao"))
thisset.remove("Taobao")
print(thisset)
#{'Google', 'Runoob'}

 

s.discard( x )

移除集合中的元素,且如果元素不存在,不会发生错误。格式如下所示:

thisset.discard('Google')
print(thisset)
#{'Runoob'}

 

s.pop() 

可以设置随机删除集合中的一个元素,语法格式如下:

thisset = set(("Google", "Runoob", "Taobao", "Facebook"))
x = thisset.pop()

print(x)
#Taobao
print(thisset)
#{'Runoob', 'Google', 'Taobao'}

 

4、清空集合

语法格式如下:

s.clear()

thisset = set(("Google", "Runoob", "Taobao"))
thisset.clear()
print(thisset)
set()

 

 

5.集合间的关系

#两个集合是否相等(元素相同就像相等)
s={10,20,30,40}
s1={40,30,20,10}
print(s==s1)
print(s!=s1)
#True
#False

#一个集合是否是一个集合的子集
s1={10,20,30,40,50,60}
s2={10,20,30,40}
s3={10,20,90}
print(s2.issubset(s1)) #True
print(s3.issubset(s1)) #False

#判断一个集合是否是另一个集合的超集
print(s1.issuperset(s2)) #True
print(s1.issuperset(s3)) #False

#两个集合是否没有交集
print(s2.isdisjoint(s3)) #False 说明有交集

 

 

6集合的数据操作

s1={10,20,30,40,50,60}
s2={10,20,30,40}
s3={10,20,90}
#交集
print(s1.intersection(s2)) #{40, 10, 20, 30}

print(s1 & s2 )  #与intersection 等价

#并集操作
print(s1.union(s2))  #{40, 10, 50, 20, 60, 30}
print(s1 | s2 )    # 与union等价

#差集操作
print(s1.difference(s2))  #{50, 60}
print(s1-s2)

#对此差集
print(s1.symmetric_difference_update(s2))
posted @ 2021-05-24 20:35  旧巷里有酒香  阅读(132)  评论(0)    收藏  举报