深浅拷贝与集合
2019-03-01 18:03:54
一、深浅拷贝
a=1 b=a a=3 print(a,b) 输出: 3,1
通过上面这段代码可以知道首先a赋值1,再将a赋给b,所以a,b的值都是1,此时a和b都是指向1,然后再给a赋值3,系统重新开辟内存存放3并让a指向,所以a得值改变并没有影响到b的值改变。简单地说a=1 b=a时a,b都是同一个房间的门牌号,但是后来来了一个新人3,系统给了3一个新
房间,并且把门牌号a扯过来挂在了3所在的房间所以a,b谁的值改变都不会影响到另一个。
s1=[[1,3],"liuzhenyi","ruanjiangonhhcheng"] s2=s1 print(s1)#输出[[1, 3], 'liuzhenyi', 'ruanjiangonhhcheng'] print(s2)#输出[[1, 3], 'liuzhenyi', 'ruanjiangonhhcheng'] s1[1]=lzy print(s1)#输出[[1, 3], 'lzy', 'ruanjiangonhhcheng'] print(s2)#输出[[1, 3], 'lzy', 'ruanjiangonhhcheng']
通过上面这段代码可以看出,当修改s1的值时s2的值也跟着改变。这是因为s1和s2都是共同指向一块内存的,在重新给s1[1]重新赋值时系统也没有重新分配内存。简单点说就是一个房间两个门牌号,通过s1,s2所访问的元素的地址是一模一样的。
s1=[[1,3],"liuzhenyi","ruanjiangonhhcheng"] s2=s1.copy()#拷贝s1给s2 s2[2]="RJ"#修改s2[2]的值 print(s1)#输出[[1, 3], 'liuzhenyi', 'ruanjiangonhhcheng'] print(s2)#输出[[1, 3], 'liuzhenyi', 'RJ'] s3=s1.copy()#拷贝s1给s3 s3[0][1]=555#修改s3[0][1]的值 print(s1)#输出[[1, 555], 'liuzhenyi', 'ruanjiangonhhcheng'] print(s3)#输出[[1, 555], 'liuzhenyi', 'ruanjiangonhhcheng']
通过上面这段代码可以看出,首先过copy()函数拷贝了s1给了s2,再修改s2[2]的值时并没有影响到s1的值,后面同样通过copy()函数拷贝s1给s3,再修改s3[0][1]的值后s1的值也一并跟着改变。这是因为copy只复制第一层数据,如果第一层数据存的是地址,则无论是通过s1修改地址所对应的数据还是通过copy出来的s3来修改地址所对应的数据都会影响到另一项数据。但是无论是通过s1或是s2来修改第一层数据都不会影响到另一项数据。通过赋值操作则相反,不管是通过原列表名或是新列表名来修改哪一层数据都会影响到另一项数据。copy()就是浅拷贝。当然如果要进行深拷贝代码:
import copy s1=[[1,3],"liuzhenyi","ruanjiangonhhcheng"] s2=copy.deepcopy(s1)#深拷贝s1给s2 s2[0][1]=500#修改s2[0][1]的值 s2[1]='ddd'#修改s2[1]的值 print(s1)
print(s2)
输出:
[[1, 3], 'liuzhenyi', 'ruanjiangonhhcheng']
[[1, 500], 'ddd', 'ruanjiangonhhcheng']
通过深拷贝的数据在后面进行修改时并不会像浅拷贝那样,修改数据时也并不会影响到另外一个数据。
二、集合set()操作
集合的作用:去重,关系运算,
#定义:
知识点回顾
可变类型是不可hash类型
不可变类型是可hash类型
#定义集合:
集合:可以包含多个元素,用逗号分割,
集合的元素遵循三个原则:
1:每个元素必须是不可变类型(可hash,可作为字典的key)
2:没有重复的元素
3:无序
注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值
set把不同的元素集合在一起(不能相同)无序的, frozenset不可变集合,取值可以用for ,迭代器遍历,用in判断元素是否在集合里。
for i in s1: print(i) print('a' in s1) print('alx' in s1) 输出 alx ppy alx False True
首先我们看set的去重,增加操作:
s1=["alx","ppy","alx"] s2=set(s1) print(s1,type(s1))#输出['alx', 'ppy', 'alx'] <class 'list'> print(s2,type(s2))#输出{'alx', 'ppy'} <class 'set'> s2=list(s2)#如果需要list类型可以强制转换 print(s2,type(s2))#输出['ppy', 'alx'] <class 'list'> s=set(s1) s.add('uuuu')#增加一个字符串"uuuu" print(s)#输出{'ppy', 'uuuu', 'alx'} s.update('ops')#将字符串ops以单个字符形式增加 print(s)#输出{'s', 'alx', 'ppy', 'uuuu', 'p', 'o'} s.remove(1)#指定删除 s.pop()#随机删除 s.clear()#清空
set还可以进行逻辑
s1=set("liuzhenyi") s2=set("lzy12314") print(s1.intersection(s2))#交集 s1|s2 print(s1.union(s2))#并集 s1&s2 print(s2.difference(s1))#差集 s2-s1 print(s1.symmetric_difference(s2))#反向差集 s1^s2 print(s1.issuperset(s2))#是否是父集 print(s1.issubset(s2))#是否是子集
s1|s2、s1&s2、s2-s1、s1^s2都是等价写法,同样可以运行。
set的比较:
print(set("qwer") == set("qwerewq"))#true print(set("qwer") < set("qwer"))#false子集