浅析Python中的赋值和深浅拷贝


Posted in Python onAugust 15, 2017

python中,A object  = B object  是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 。

浅析Python中的赋值和深浅拷贝

此时当B对象里面的内容发生更改的时候,A对象也自然而然的会跟着更改。

name = ["root","admin"]
cp_name = name # 对cp_name进行赋值操作
# 对name列表进行插入
name.append('root_temp')
print(name,cp_name) # ['root', 'admin', 'root_temp'] ['root', 'admin', 'root_temp']
print(id(name),id(cp_name)) # 23991960 23991960

而想要进行浅拷贝或者深拷贝,就需要引入copy模块 。

首先来说下浅拷贝,当进行浅拷贝时,使用copy.copy()方法。

import copy
name = ["root","admin"]
# 进行浅拷贝操作
cp_name = copy.copy(name)
# 查看cp_name,name
print(name,cp_name) # ['root', 'admin'] ['root', 'admin'] 拷贝成功
#查看地址
print(id(name),id(cp_name)) # 21146920 21147160 内存地址并不相同
# 尝试对name进行更改
name.append('root_temp')
# 查看cp_name是否更改
print(cp_name) # ['root', 'admin'] 内容并没有更改

A = copy.copy(B) 此时A对象相当于把B对象中的内容给完成的拷贝了一份,存储在了一份新的内存地址当中。

其中有一点需要注意,如下:

import copy
name = ['root','admin',['root_temp','admin_temp']]
cp_name = copy.copy(name)
# 查看两个对象的地址
print(id(name),id(cp_name)) # 24358504 24428952 二者的地址并不相同
# 对name 进行更改
name.append('test')
# 查看cp_name是否更改
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] cp_name并未更改
# 在来对name中的列表对象进行更改
name[2].append('ttttt')
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp', 'ttttt']] 发现cp_name内容发生了变化

在上面的代码中,通过copy.copy()方法把name对象浅拷贝给了cp_name,此时二者的内容相同,但是地址不同,说明通过浅拷贝后,cp_name相当于重新开辟了一块内存空间用来存储拷贝过来的内容。所以说,当name.append()第一次插入值的时候,cp_name对象没有变化,因为cp_name和name 处于两个不同的内存空间,是独立的。

而浅拷贝的问题在于,只能够拷贝第一层的内容,至于说第二层以及第三层或者第n层,对于浅拷贝来说都是无能为力的,只能简单的拷贝一份内存地址。

所以说,对于name 这个对象中,列表第一层发生更改,是不会影响cp_name的,而一旦更改了第二层或者第n层的内容,cp_name都会被影响,因为此时的cp_name对象里面子列表是与name的子列表共享相同的内存空间。

而如果想要对第一层以及第二层甚至第n层都进行彻底的拷贝,那么就需要使用深层拷贝。

深层拷贝需要使用copy模块的deepcopy()方法。

import copy
name = ['root','admin',['root_temp','admin_temp']]
cp_name = copy.deepcopy(name)
# 查看二者的id
print(id(name),id(cp_name)) # 29863528 29933976 地址不同,说明开辟了处于两块不同的空间
# 对name 第一层以及第二层进行更改
name.append('t1')
name[2].append('t2')
# 查看cp_name是否内容发生变化
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] 内容并未发生更改

此时,cp_name对象并不会被name所影响,无论name对象的第一层列表还是第n层的更改和变化,都不会影响cp_name,因为此时通过深层拷贝,两个对象已经完全的处于两个不同的独立内存空间,而这也就是深层拷贝。

总结

以上所述是小编给大家介绍的Python中的赋值和深浅拷贝,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
python执行get提交的方法
Apr 29 Python
python获取文件扩展名的方法
Jul 06 Python
Python可变参数函数用法实例
Jul 07 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
Django学习笔记之ORM基础教程
Mar 27 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
如何利用Python分析出微信朋友男女统计图
Jan 25 Python
对PyQt5中树结构的实现方法详解
Jun 17 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
Python OpenCV读取显示视频的方法示例
Feb 20 Python
python 破解加密zip文件的密码
Apr 22 Python
Python单例模式的两种实现方法
Aug 14 #Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 #Python
python使用super()出现错误解决办法
Aug 14 #Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 #Python
python itchat实现微信自动回复的示例代码
Aug 14 #Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 #Python
django 创建过滤器的实例详解
Aug 14 #Python
You might like
一个更简单的无限级分类菜单代码
2007/01/16 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
PHP检测一个数组有没有定义的方法步骤
2019/07/20 PHP
提高网站信任度的技巧
2008/10/17 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
Vue性能优化的方法
2020/07/30 Javascript
vue-cli3自动消除console.log()的调试信息方式
2020/10/21 Javascript
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
2020/06/04 HTML / CSS
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
个人承诺书
2014/03/26 职场文书
化学教育专业自荐信
2014/07/04 职场文书
煤矿安全生产月活动总结
2014/07/05 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
热爱劳动主题班会
2015/08/14 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书