Python入门-深浅拷贝
首先我们在这里先补充一下基础数据类型的一些知识:
一.循环删除
1.前面我们学了列表,字典和集合的一些操作方法:增删改查,现在我们来看一下这个问题:
有这样一个列表:
lst = ['周杰伦','周润发','周星驰','刘德华']
如果现在要求我们删除带'周'的元素,我们下意识会这样做:
lst = ['周杰伦','周润发','周星驰','刘德华']
for i in lst:
if '周' in i:
lst.remove(i)
print(lst) #['周润发', '刘德华']
但是结果却是不对,没有删干净,这是为什么,这是因为python内部的机制不允许在for循环内部删除元素,同样的字典同样如此:
dic = {'周杰伦':'jay','周润发':'发哥','周星驰':'星爷','刘德华':'华仔'}
for i in dic:
if '周' in i:
dic.pop(i)
print(dic) #报错:dictionary changed size during iteration.字典在循环过程中改变了大小
集合同样,在这里就不多说了,有兴趣可以自己私底下去敲一敲.
那么就没办法删除吗?当然有,还用上边的例子,不过要加点东西:
dic = {'周杰伦':'jay','周润发':'发哥','周星驰':'星爷','刘德华':'华仔'}
lst = [] #建一个列表
for i in dic:
if '周' in i:
lst.append(i) #把符合条件的添加到列表当中,
for l in lst: #然后循环这个这列表
dic.pop(l) #再删除对应的键值对
print(dic) #{'刘德华': '华仔'}
这样我们就拿到了我们想要的东西了,列表也是同样的操作,自己私下里可以练练.
2.字符串与列表
关于字符串也有一个知识点我们没有说,
lst = ['周杰伦','周润发','周星驰','刘德华']
s = '_'.join(lst)
print(s) #周星驰_周润发_刘德华_周杰伦
输出的是字符串类型,如果以后有列表转化成字符串的操作就可以用join了,那与之对应的是什么呢?
s = '周星驰_周润发_刘德华_周杰伦'
lst = s.split('_')
print(lst) #['周杰伦','周润发','周星驰','刘德华']
那就是我们之前说过的split,它输出的是列表类型,把字符串转换成列表类型
我们再来补充几个常见的陷阱问题:
陷阱1:
fromkeys()帮我们创建字典用的,把第一个参数进行迭代,拿到每一项作为key和后面的value组合成字典
d = dict.fromkeys('张无忌','赵敏') #创建字典
print(d) #{'张': '赵敏', '无': '赵敏', '忌': '赵敏'}
返回的是新字典,和原来的字典没有关系
dic = {}
d = dic.fromkeys("风扇哥", "很困")
print(dic) # {}
print(d) #{'风': '很困', '扇': '很困', '哥': '很困'}
陷阱2:
如果value是可变的数据类型,那么其中一个key对应的value执行的更改操作,其他的也跟着变
d = dict.fromkeys("胡辣汤", [])
print(d) # {'胡': [], '辣': [], '汤': []}
print(id(d['胡']))#32118600
print(id(d['辣']))#32118600
print(id(d['汤']))#32118600
d['胡'].append('河南特色')
print(d)# {'胡': ['河南特色'], '辣': ['河南特色'], '汤': ['河南特色']}
接下来就让我们来看看今天最重要的内容:深浅拷贝
二.深浅拷贝
lst1 = ['周星驰','周润发','周杰伦','刘德华']
lst2 = lst1
print(lst1)
print(lst2)
lst1.append('梁朝伟')
print(lst1)
print(lst2)
结果:
['周星驰', '周润发', '周杰伦', '刘德华']
['周星驰', '周润发', '周杰伦', '刘德华']
['周星驰', '周润发', '周杰伦', '刘德华', '梁朝伟']
['周星驰', '周润发', '周杰伦', '刘德华', '梁朝伟'] dic = {'周润发':'发哥','周星驰':'星爷'}
dic1 = dic
print(dic)
print(dic1)
dic['周杰伦'] = 'jay'
print(dic)
print(dic1)
结果:
{'周润发': '发哥', '周星驰': '星爷'}
{'周润发': '发哥', '周星驰': '星爷'}
{'周润发': '发哥', '周星驰': '星爷', '周杰伦': 'jay'}
{'周润发': '发哥', '周星驰': '星爷', '周杰伦': 'jay'}
对于列表,字典,集合来说,直接赋值其实是把内存地址交给变量,并不是复制一份内容,所以,lst1的内容指向和lst2是一样的,lst1改变了,lst2也发生了改变
浅拷贝:
lst1 = ['周润发','周星驰','周杰伦','刘德华']
lst2 = lst1.copy()
lst1.append('梁朝伟')
print(lst1)
print(lst2)
print(id(lst1),id(lst2))
结果:
['周润发', '周星驰', '周杰伦', '刘德华', '梁朝伟']
['周润发', '周星驰', '周杰伦', '刘德华']
37492552 31136264
内存地址和内容都不一样了,实现了拷贝
lst1 = ['周润发','周星驰','周杰伦','刘德华',['刘嘉玲','莫文蔚','昆凌','陈慧琳']]
lst2 = lst1.copy()
lst1[4].append('都是美女')
print(lst1)
print(lst2)
print(id(lst1),id(lst2))
结果:
['周润发', '周星驰', '周杰伦', '刘德华', ['刘嘉玲', '莫文蔚', '昆凌', '陈慧琳', '都是美女']]
['周润发', '周星驰', '周杰伦', '刘德华', ['刘嘉玲', '莫文蔚', '昆凌', '陈慧琳', '都是美女']]
37820232 37820232
浅拷贝拷贝的只是第一层的内容,所以才叫浅拷贝
深拷贝:
import copy
lst1 = ['周润发','周星驰','周杰伦','刘德华',['刘嘉玲','莫文蔚','昆凌','陈慧琳']]
lst2 = copy.deepcopy(lst1)
lst1[4].append('都是美女')
print(lst1)
print(lst2)
print(id(lst1),id(lst2))
结果:
['周润发', '周星驰', '周杰伦', '刘德华', ['刘嘉玲', '莫文蔚', '昆凌', '陈慧琳', '都是美女']]
['周润发', '周星驰', '周杰伦', '刘德华', ['刘嘉玲', '莫文蔚', '昆凌', '陈慧琳']]
39434696 39435656
内容和内存地址都不一样了,深拷贝就是把里面的内容都拷贝下来,变成内容相同内存地址不同的两个列表,好了,最后给大家留一道练习题:
a = [1,[2]]
a[1] = a
print(a[1])
Python入门-深浅拷贝的更多相关文章
- Python原理 -- 深浅拷贝
python原理 -- 深浅拷贝 从数据类型说开去 str, num : 一次性创建, 不能被修改, 修改即是再创建. list,tuple,dict,set : 链表,当前元素记录, 下一个元素的位 ...
- Python的深浅拷贝
Python的深浅拷贝 深浅拷贝 1. 赋值,对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量并不是复制一份内容 list1 = [']] list2 = list1 p ...
- 24、简述Python的深浅拷贝以及应用场景
深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...
- day2学python 数据类型+深浅拷贝+循环
数据类型+深浅拷贝+循环 别的语言的数组 python不用定义 直接使用 color=['红','橙','黄','绿','青','蓝','紫'] print(color[1:3]) //打印[1,3) ...
- 简述Python的深浅拷贝以及应用场景
深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...
- python 赋值 深浅拷贝
深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 impor ...
- Python随笔---深浅拷贝
Python中为了避免某些方法的副作用(拷贝后有时更改原有数据),故存在有深浅拷贝的存在 浅拷贝导入copy方法集,使用copy_copy的方法进行 深拷贝一样导入copy方法集,使用copy_dee ...
- python 的深浅拷贝问题
深浅拷贝概念 基本类型和引用类型数据拷贝的问题.因为基本类型的数据大小是固定的,所以他保存在栈内存中:而引用类型的数据大小不固定,因而保存在堆内存中,单引用类型在栈内存中只保存一个指向堆内存的指针. ...
- python的深浅拷贝-成为马老师的弟子
参考链接 骏马金龙 前提 想要了解深浅拷贝之前必须要知道可变和不可变类型,和他们的特性 不可变类型 数字 字符串 元组 不可变集合 特性:改变值,会创建新的内存空间存储数据 可变类型 列表 字典 可变 ...
随机推荐
- 拓扑排序+DP CF721C Journey
CF721C Journey 给出一个\(n\)个点\(m\)条边的有向无环图. 问从\(1\)到\(n\),在距离不超过\(k\)的情况下最多经过多少点,并输出一个方案. \(topo\)+\(DP ...
- 01Trie树 CF923C Perfect Security
CF923C Perfect Security 上下各n个数,求一种排列p,使上面的数i异或pi成为新的数i,求方案另字典序最小,输出该结果 01Trie树. 记录每个节点经过多少次. 每一次查询的时 ...
- 动态渲染可编辑单元格的Table
一.问题描述 问题是这样的,后台传了xArr = [x1, x2,...,xn]和yArr = [y1, y2, ..yn]两个数组,前端要渲染出表格并且可以填写每个单元格的值,然后按照一定数据结构保 ...
- Vue项目 注释模板
此内容只适用于vscode 1.打开项目->按快捷键->ctrl+shift+p 2.选择红线选中的内容 ,如果是中文版看如下图片 如果是英文版看如下图 3.就开始进行配置 大家根据这张图 ...
- [原创]VMware Workstation 14.1.3 Pro安装CentOS_7.6.1810
前言 Linux作为最主流的服务器操作系统,在市场上的使用占比保持着领先对位.其中CentOS作为基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本,在企业的服务器中,也 ...
- 二分--POJ-3258
POJ-3258,二分 题目 Description Every year the cows hold an event featuring a peculiar version of hopscot ...
- 使用docker部署STF服务(CentOS环境)
一.安装docker环境 更新软件 sudo yum update 执行安装 sudo yum install docker 查看docker镜像 sudo docker images 二.拉取相关镜 ...
- 3.抓包神器Fiddler简介(转载)
转自:https://www.cnblogs.com/ailiailan/p/hanxiaobei.html 使用Fiddler的两个场景,1:客户端对服务端返回数据的容错:2:服务端对异常请求数据的 ...
- 查看SqlServer某张表的物理空间占用情况
以下语句可以查看表的物理空间使用情况 包括 [ROWS] 内容的行数.. [reserved] 保留的磁盘大小.. [data] 数据占用的磁盘大小.. [index_size] 索引占用的磁盘大小. ...
- Oracle PL/SQL编程之过程
1.简介 过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分,通过使用输出参数,可以将执行部分的数据传递 ...