Python之集合与深浅拷贝
一.集合(可变数据类型,但是元素必须是不可变的数据类型,无序,元素具有唯一性)
add -- 给集合添加一个元素
clear -- 清空一个集合 ==> set()
copy -- 返回一个浅拷贝集合
difference
set1 = {1,2,3,4}
set2 = {2,3,4,5}
set1.difference(set2) ==> {1} # 返回set1有set2中没有的元素组成的集合
print(set1 - set2) ==> {1} 同上
difference_update
set1.difference_update(set2)
print(set1,set2) ==> {1} {2,3,4,5} # 删除set1中有,同时set2中也有的元素
intersection # 返回两个集合的交集
set2.intersection_update(set1) # 删除set2中同时存在与set1中的元素
isdisjoint #
set2.issubset(set1) # 判断set2是否是set1的子集
set2 < set1
set1.issuperset(set2) # 判断set1是否包含set2的所有元素
set1 > set2
pop # 弹出集合元素
remove # 删除一个指定的元素
symmetric_difference #返回两个集合中独有的元素组成的集合
set1.symmetric_difference_update(set2) # 用两个集合中独有的元素组成的集合替换set1
union # 返回两个集合的并集
set1 | set2
set1.update(set2) # 用两个集合的并集替换前一个集合
二.深浅拷贝
python中一切皆对象,变量存储的是对象的内存地址,每做一次赋值操作,都开辟一块新的内存
空间存放值,同时将内存地址赋值给变量(小数据池范围内除外)
str1 = 'hello'
str2 = 'HELLO'
print(id(str1),id(str2)) ==> 1565926888424 1565926888256
--------------针对深拷贝-----------------------------------------------------------
对于复杂数据结构来说,增删改数据结构内部元素并不会引起整个数据结构内存地址的改变
只影响所修改的元素的内存地址
lst = [1,3,4,5]
print(lst,id(lst)) ==> [1, 3, 4, 5] 1565926868744
lst.append(6)
print(lst,id(lst)) ==> [1, 3, 4, 5, 6] 1565926868744
lst.pop(3)
print(lst,id(lst)) ==> [1, 3, 4, 6] 1565926868744
lst[0] = '修改为一个字符串'
print(lst,id(lst)) ==> ['修改为一个字符串', 3, 4, 6] 1565926868744
复杂数据结构的赋值操作,多个引用指向同一个内存地址,通过任意变量修改数据结构,其它
变量的访问同时受到影响
lst1 = lst
lst.append(7)
print(lst,id(lst),lst1,id(lst1)) ==> [0, 3, 4, 6, 7] 1565926868744 [0, 3, 4, 6, 7] 1565926868744
如果需要赋值一份独立的数据,需要用到拷贝
深拷贝:复制一份完全一模一样的数据,新数据与原数据内存地址不同
import copy
slst = [1,2,[3,4,[5,6]]]
clst = copy.deepcopy(slst)
print(id(slst),id(clst)) ==> 1565926868488 1565928337544
数据结构和所有元素均一样,元素未修改的时候和原数据结构相同,一旦发生修改,则新开辟一块内存空间存储新值
print(id(slst[0]),id(clst[0])) ==> 1886940176 1886940176
slst[0] = 'change'
print(id(slst[0]),id(clst[0])) ==> 1565926889936 1886940176
深拷贝不管有几层嵌套,修改元素新开辟内存空间均只影响本数据结构
--------------针对浅拷贝-----------------------------------------------------------
复杂数据结构执行浅拷贝操作,整体内存地址发生改变
slst = [1, 2, [3, 4, [5, 6]]]
print(id(slst),id(nclst)) ==> 1565926868488 1565928339144
第一层元素未变化时,内存地址相同,发生变化后,新开辟一块内存存放新内容,只影响
本数据结构
print(id(slst[0]),id(nclst[0])) ==> 1565926889936 1565926889936
slst[0] = 'nchange'
print(id(slst[0]),id(nclst[0])) ==> 1565926889992 1565926889936
第二层以后的元素发生改变时,开辟新空间,同时原数据结构和复制的数据结构同时指向新开辟的内存地址
print(slst[2][0],id(slst[2][0]),nclst[2][0],id(nclst[2][0])) ==> 3 1886940240 3 1886940240
slst[2][0] = 'schange'
print(slst[2][0],id(slst[2][0]),nclst[2][0],id(nclst[2][0])) ==> schange 1565926888592 schange 1565926888592
nclst[2][0] = 'ncchange'
print(slst[2][0],id(slst[2][0]),nclst[2][0],id(nclst[2][0])) ==> ncchange 1565926904560 ncchange 1565926904560
三.补充(删除列表中的元素列表的索引发生变化)
lst = [x for x in range(10)]
>>> for i in range(len(lst)):
... print(i)
... del lst[i]
... print(lst)
...
0
[1, 2, 3, 4, 5, 6, 7, 8, 9]
1
[1, 3, 4, 5, 6, 7, 8, 9]
2
[1, 3, 5, 6, 7, 8, 9]
3
[1, 3, 5, 7, 8, 9]
4
[1, 3, 5, 7, 9]
5
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
IndexError: list assignment index out of range
- 鲶鱼CMS存储XSS漏洞披露
- 【分享】 纯 js 表单控件 —— 让 “增改查” 更轻松!
- K-近邻算法(KNN)概述
- 不使用DalFactory和IDAL,支持多种数据库应用
- MVC和三层,我的一个不成熟的看法,大家批批
- 实体类的二进制序列化
- 多任务验证码识别
- 一加手机系统预装APP被曝存在后门
- 单数据库,多数据库,单实例,多实例不同情况下的数据访问效率测试
- 打造轻量级的实体类数据容器
- “设计应对变化”--实例讲解一个数据同步系统
- TOP语句放到表值函数外,效率异常低下
- 从吉日嘎拉那里学到的……
- 【分享】纯js的n级联动列表框 —— 基于jQuery,支持下拉列表框和列表框,最重要的是n级,当然还有更重要的
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- mysql 同一张表查询 left join
- uni-app运行到浏览器跨域H5页面的跨域问题解决方案
- 手牵手,使用uni-app从零开发一款视频小程序 (系列上 准备工作篇)
- 树状数据库表查询2次以上(自连接、内连接、别名)方法
- 网页背景H5视频自动播放---PC端、移动端兼容问题完美解决方案(IOS、安卓、微信端)
- 【STM32F407】第11章 RL-TCPnet V7.X之TCP服务器
- 如何解决nodejs中cpu密集型的任务
- 博客园主题1【备份】
- 手牵手,使用uni-app从零开发一款视频小程序 (系列下 开发实战篇)
- POSTGRESQL 到底怎么访问同instance 的库--
- 简单工厂模式
- 这 9 种方法有效帮你提高国内访问 Github 的速度
- python实现sm2和sm4国密(国家商用密码)算法
- 面试常考算法之区间问题
- 爬虫 | JS逆向某验滑动加密分析