Python基础篇(set集合,深浅拷贝)

set集合是Python的一个基本类型,一般是不常用.set中的元素是不重复的.无序的里边

的元素必须是可hash的比如int,str,tuple,bool 我们可以这样记,set就是dict类型的数据但是不保存value,只保存key,

set也用{}表示

注意:set集合中的元素必须是可hash的,但是set本事是不可hash的. set是可变的.

set1 = {'','alex',2,True,[1,2,3]} # 报错
set2 = {'','alex',2,True,{1:2}} # 报错
set3 = {'','alex',2,True,(1,2,[2,3,4])} # 报错

set中的元素是不重复的且是无序的.

s = {"周杰伦", "周杰伦", "周星星"}
print(s)
结果:
{'周星星', '周杰伦'}

使用这个特性.我们可以使用set来去掉重复的

# 给list去重复
lst = [45, 5, "哈哈", 45, '哈哈', 50]
lst = list(set(lst)) # 把list转换成set, 然后再转换回list
print(lst)

set集合增删改查

1,增加

s = {"刘嘉玲", '关之琳', "王祖贤"}
s.add("郑裕玲")
print(s)
s.add("郑裕玲") # 重复的内容不会被添加到set集合中
print(s)
s = {"刘嘉玲", '关之琳', "王祖贤"}
s.update("麻花藤") # 迭代更新
print(s)
s.update(["张曼玉", "李若彤","李若彤"])
print(s)

2.删除

s = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"}
item = s.pop() # 随机弹出一个.
print(s)
print(item)
s.remove("关之琳") # 直接删除元素
# s.remove("马虎疼") # 不存在这个元素. 删除会报错
print(s)
s.clear() # 清空set集合.需要注意的是set集合如果是空的. 打印出来是set() 因为要和
dict区分的.
print(s) # set()

3.修改

# set集合中的数据没有索引. 也没有办法去定位⼀个元素. 所以没有办法进行直接修改.
# 我们可以采用先删除后添加的方式来完成修改操作
s = {"刘嘉玲", '关之琳', "王祖贤","张曼玉", "李若彤"}
# 把刘嘉玲改成赵本⼭
s.remove("刘嘉玲")
s.add("赵本山")
print(s)

4.查询

# set是一个可迭代对象. 所以可以进行for循环
for el in s:
print(el)

5.常用操作

s1 = {"刘能", "赵四", "皮长山"}
s2 = {"刘科长", "冯乡长", "皮长山"}
# 交集
# 两个集合中的共有元素
print(s1 & s2) # {'皮长山'}
print(s1.intersection(s2)) # {'皮长山'} #并集
print(s1 | s2) # {'刘科长', '冯乡长', '赵四', '皮长山', '刘能'}
print(s1.union(s2)) # {'刘科长', '冯乡长', '赵四', '皮长山', '刘能'}
# 差集
print(s1 - s2) # {'赵四', '刘能'} 得到第⼀个中单独存在的
print(s1.difference(s2)) # {'赵四', '刘能'}
# 反交集
print(s1 ^ s2) # 两个集合中单独存在的数据 {'冯乡长', '刘能', '刘科长', '赵四'}
print(s1.symmetric_difference(s2)) # {'冯乡长', '刘能', '刘科长', '赵四'}
s1 = {"刘能", "赵四"}
s2 = {"刘能", "赵四", "皮长山"}
# ⼦集
print(s1 < s2) # set1是set2的⼦集吗? True
print(s1.issubset(s2))
# 超集
print(s1 > s2) # set1是set2的超集吗? False
print(s1.issuperset(s2))

set结合本省是可以发生改变的,是不可hash的我们可以用frozenset来保存数据.jrozenset是不可改变的

也是一个可哈希的数据类型.

s = frozenset(["赵本⼭", "刘能", "皮长山", "长跪"])
dic = {s:''} # 可以正常使用了
print(dic)

这不是常用的

二.深浅拷贝

lst1 = ["金毛狮王", "紫衫龙王", "白眉鹰王", "青翼蝠王"]
lst2 = lst1
print(lst1)
print(lst2)
lst1.append("杨逍")
print(lst1)
print(lst2)
结果:
['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王', '杨逍']
['金毛狮王', '紫衫龙王', '白眉鹰王', '青翼蝠王', '杨逍'] dic1 = {"id": 123, "name": "谢逊"}
dic2 = dic1
print(dic1)
print(dic2)
dic1['name'] = "范瑶"
print(dic1)
print(dic2)
结果:
{'id': 123, 'name': '谢逊'}
{'id': 123, 'name': '谢逊'}
{'id': 123, 'name': '范瑶'}
{'id': 123, 'name': '范瑶'}

对于list,set,di ct来说,直接赋值,其实是把内存地址交给了变量,并不是复制一份内容,所以

lst1的内存指向和lst2是一样的.lst1改变了,lst2也发生了改变

浅拷贝:

lst1 = ["何炅", "杜海涛","周渝⺠"]
lst2 = lst1.copy()
lst1.append("李嘉诚")
print(lst1)
print(lst2)
print(id(lst1), id(lst2))
结果:
两个lst完全不⼀样. 内存地址和内容也不⼀样. 发现实现了内存的拷⻉
lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
lst2 = lst1.copy()
lst1[3].append("⽆敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '马芸', '周笔畅', '⽆敌是多磨寂寞']]
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '马芸', '周笔畅', '⽆敌是多磨寂寞']]
4417248328 4417248328

浅拷贝只会拷贝第一层,第二层的内容不会拷贝,所以被称为浅拷贝

深拷贝:

import copy
lst1 = ["何炅", "杜海涛","周渝⺠", ["麻花藤", "马芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("⽆敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '马芸', '周笔畅', '⽆敌是多磨寂寞']]
['何炅', '杜海涛', '周渝⺠', ['麻花藤', '马芸', '周笔畅']]
4447221448 4447233800

都不一样了 ,深度拷贝,把元素完全进行拷贝赋值,不会产生一个改变另一个跟着改变的问题

最新文章

  1. CSS实现背景透明,文字不透明,兼容所有浏览器
  2. 由一段JS代码引发的思考
  3. CentOS 7.0 部署 Django 到运行起来第一个web service
  4. 移动端:active,:hover无法很好触发动画的解决方案
  5. [J2ME] 基本框架框架
  6. 【原】macbook不睡眠的排查与解决
  7. VM 打开虚拟机时报“内部错误”
  8. Mybatis 构造resultMap 搜sql
  9. 《剑指Offer》算法题——“旋转数组”的最小数字
  10. PowerDesigner中逆向工程将数据库中comment赋值到name
  11. Springboot的默认定时任务——Scheduled注解
  12. .NET 绝对路径的配置
  13. 阿里云部署SSL证书详解
  14. 【vijos1943】上学路上
  15. postgresql安装概览
  16. Google搜索
  17. Python3输入输出
  18. Linux基础知识_Shell编程笔记
  19. LDO和DC-DC的概念,区别及优缺点
  20. 一个rcu回调导致的简单死锁

热门文章

  1. shell函数与位置参数举例
  2. 各种条码的校验码算法(EAN13,COD128,GTIN,UCC等)
  3. JDBC之Statement、PreparedStatement和CallableStatement
  4. Oracle统计分析
  5. WriteDataToFile(filename,pJsonData,strlen(pJsonData)+1)
  6. Sass--混合宏--声明宏
  7. 不在同一个解决方案下的exe去调试dll,采用附加到进程:
  8. spring-boot整合Mybatis多数据源案例
  9. 【MySQL】selectKey获取insert后的自动主键
  10. spring+cxf