浅析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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
python模块简介之有序字典(OrderedDict)
Dec 01 Python
利用Python中的pandas库对cdn日志进行分析详解
Mar 07 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
把pandas转换int型为str型的方法
Jan 29 Python
Django中create和save方法的不同
Aug 13 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 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
PHP获取客户端真实IP地址的5种情况分析和实现代码
2014/07/08 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
php+jQuery+Ajax简单实现页面异步刷新
2016/08/08 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
jQuery使用手册之一
2007/03/24 Javascript
Javascript Object.extend
2010/05/18 Javascript
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
python实现的防DDoS脚本
2011/02/08 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
销售经理工作职责范文
2013/12/03 职场文书
党员党性分析材料
2014/02/17 职场文书
给妈妈洗脚活动方案
2014/08/16 职场文书
关于环保的活动方案
2014/08/25 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
工艺技术员岗位职责
2015/02/04 职场文书
地心历险记观后感
2015/06/15 职场文书
担保书格式范文
2015/09/22 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
Java 数据结构七大排序使用分析
2022/04/02 Java/Android
TypeScript 内置高级类型编程示例
2022/09/23 Javascript