浅析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实现数据库编程方法详解
Jun 09 Python
python利用lxml读写xml格式的文件
Aug 10 Python
利用Python2下载单张图片与爬取网页图片实例代码
Dec 25 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
解决python大批量读写.doc文件的问题
May 08 Python
flask框架视图函数用法示例
Jul 19 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
python脚本执行CMD命令并返回结果的例子
Aug 14 Python
python 中xpath爬虫实例详解
Aug 26 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
把vgg-face.mat权重迁移到pytorch模型示例
Dec 27 Python
Python双链表原理与实现方法详解
Feb 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
香妃
2021/03/03 冲泡冲煮
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
PHP插入排序实现代码
2013/04/04 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
PHP7 新增常量
2021/03/09 PHP
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
Python 性能优化技巧总结
2016/11/01 Python
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
使用python socket分发大文件的实现方法
2019/07/08 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
企业申诉管理制度
2014/01/30 职场文书
高中学生期末评语
2014/04/25 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
个人委托书如何写
2014/09/25 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
javascript Number 与 Math对象的介绍
2021/11/17 Javascript