拷贝就是拷贝,何来深浅之说?

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果

其实这个是由于共享内存导致的结果

拷贝:原则上就是把数据分离出来,复制其数据,并以后修改互不影响。

先看 一个非拷贝的例子

=赋值:数据完全共享(=赋值是在内存中指向同一个对象,如果是可变(mutable)类型,比如列表,修改其中一个,另一个必定改变

如果是不可变类型(immutable),比如字符串,修改了其中一个,另一个并不

   

 

l1 = [1, 2, 3, ['aa', 'bb']]
l2 = l1
l2[0]='aaa'
l2[3][0]='bbb'
print(l1) #['aaa', 2, 3, ['bbb', 'bb']]
print(id(l1)==id(l2)) #True

l2 = l1 ,l1 完全赋值给l2 ,l2的内存地址与l1 相同,即内存完全指向

浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

如上述代码,l2浅拷贝了l1 ,之后l2把其列表中的列表的元素给修改,从结果看出,l1也被修改了。但是仅仅修改l1列表中的第一层元素,却并没有影响l2。

比较一下l2与l1的内存地址:False,说明,l2在内存中已经独立出一部分复制了l1的数据,但是只是浅拷贝,第二层的数据并没有拷贝成功,而是指向了l1中的第二层数据的内存地址,所以共享内存‘相当于‘’等号赋值’‘,所以就会有l2中第二层数据发生变化,l1中第二层数据也发生变化

如图,这就是浅拷贝的原理,l2拷贝l1的时候只拷贝了他的第一层,也就是在其他内存中重新创建了l1的第一层数据,但是l2无法拷贝l1的第二层数据,也就是列表中的列表,所以他就只能指向l1中的第二层数据

由此,当修改l1中第二层数据的时候,浅拷贝l1的l2中的第二层数据也随之发生改变

深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)

深拷贝就是完完全全复制了一份,且数据不会互相影响,因为内存不共享。

深拷贝的方法有

导入模块

1
2
3
4
5
6
7
import copy
l1 = [1, 2, 3, [11, 22, 33]]
# l2 = copy.copy(l1)  浅拷贝
l2 = copy.deepcopy(l1)
print(l1,'>>>',l2)
l2[3][0] = 1111
print(l1,">>>",l2)

 由此可见深拷贝就是数据完完全全独立拷贝出来一份。不会由原先数据变动而变动

最新文章

  1. SQL Server 2012故障转移的looksalive check和is alive check
  2. SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
  3. MongoDB与Mysql常用命令解释
  4. PAT1003——我要通过!
  5. Java线程(转)
  6. 创建支持CRUD(增删改查)操作的Web API(二)
  7. TFS 服务器更换后工作区无法绑定
  8. JBoss7安装、测试、配置和启动以及停止,部署
  9. cache buffer
  10. 学习MySQL(下)
  11. 关于MD5+salt盐加密
  12. 基于.NET平台常用的框架整理<转载>
  13. zabbix图形乱码问题解决办法
  14. $Django 多表操作(增删改查,基于双下划线,对象的查询) 在Python脚本中调用Django环境
  15. ArcPy第一章-Python基础
  16. vue中对axios进行封装
  17. php操作mysql几个常用操作
  18. Pytorch基本变量类型FloatTensor与Variable
  19. ASP项目部署IIS7.5中遇到的问题
  20. MogileFS与FastDFS的个人见解

热门文章

  1. (appium+python)UI自动化_09_unittest批量运行测试用例&生成测试报告
  2. Test Case Design Method - OATS
  3. Edit the AlarmClock in AOSP with android-studio
  4. Jmeter JAVA请求入门
  5. 使用form提交到搜狗浏览器示例
  6. oracle ALL视图
  7. photoshop中调整图层的颜色深浅明暗
  8. 微信小程序(18)-- 自定义头部导航栏
  9. [BJOI2006]狼抓兔子(网络流)
  10. demo板 apt-get install stress