浅析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中操作时间之tzset()方法的使用教程
May 22 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
python安装教程
Feb 28 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
Python根据文件名批量转移图片的方法
Oct 21 Python
python批量获取html内body内容的实例
Jan 02 Python
对python 自定义协议的方法详解
Feb 13 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
python对常见数据类型的遍历解析
Aug 27 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 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网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
vue-loader教程介绍
2017/06/14 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
Python高效编程技巧
2013/01/07 Python
下载给定网页上图片的方法
2014/02/18 Python
python简单分割文件的方法
2015/07/30 Python
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
python正则表达式的使用
2017/06/12 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
Python selenium爬虫实现定时任务过程解析
2020/06/08 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
浅谈python出错时traceback的解读
2020/07/15 Python
python Matplotlib模块的使用
2020/09/16 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
Lucene推荐的分页方式是什么?
2015/12/07 面试题
医院护士见习期自我鉴定
2014/04/10 职场文书
教师中国梦演讲稿
2014/04/23 职场文书
亮剑精神演讲稿
2014/05/23 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
介绍信怎么写
2015/01/30 职场文书
教师辞职信范文
2015/02/28 职场文书
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python