当前位置: 首页 > news >正文

python列表中的深浅copy

列表中的赋值和平常的赋值是不一样的,看下面的代码:
In [1]: a = 1
 
In [2]: b = a
 
In [3]: a
Out[3]: 1
 
In [4]: b
Out[4]: 1
 
In [5]: id(a)
Out[5]: 4452948992
 
In [6]: id(b)
Out[6]: 4452948992
 
In [7]: id(1)
Out[7]: 4452948992
 
In [8]: a = 4
 
In [9]: b
Out[9]: 1
 
In [10]: id(a)
Out[10]: 4452949088
 
In [11]: id(b)
Out[11]: 4452948992
 
In [12]: id(1)
Out[12]: 4452948992
在这段代码中,a = 1,a指向内存地址;b = a,b也指向内存地址1,所以当a指向内存地址4的时候,b的值不变,因为b指向的内存地址是1而不是a。
在列表中就不一样了,下面介绍列表的深浅copy
 
1.直接赋值
In [1]: li = [1,2,3]
 
In [2]: n = li
 
In [3]: li
Out[3]: [1, 2, 3]
 
In [4]: n
Out[4]: [1, 2, 3]
 
In [5]: li[0] = 'a'
 
In [6]: li
Out[6]: ['a', 2, 3]
 
In [7]: n
Out[7]: ['a', 2, 3]
 
In [8]: id(li)
Out[8]: 4342626376
 
In [9]: id(n)
Out[9]: 4342626376
 
In [10]: id([1,2,3])
Out[10]: 4440762824
 
可以看出,在列表中,n是指向了li的内存地址, 不是列表[1,2,3]了,所以li的值变化的话,n也跟着变化。可以想象成li和n都指向了一个水杯,水杯里有三块白糖,把其中一块换成了黑糖,
那不管是用li还是n,水杯里现在都是有两块白糖和一块黑糖。 2.浅copy
In [1]: li2 = [1,2,3,['alex',27]]
 
In [2]: n2 = li2.copy()
 
In [3]: li2
Out[3]: [1, 2, 3, ['alex', 27]]
 
In [4]: n2
Out[4]: [1, 2, 3, ['alex', 27]]
 
In [5]: id(li2),id(n2)
Out[6]: (4536317192, 4536271560)
 
In [6]: li2[0] = 'a'
 
In [7]: li2
Out[7]: ['a', 2, 3, ['alex', 27]]
 
In [8]: n2
Out[8]: [1, 2, 3, ['alex', 27]]
 
In [9]: id(li2[0]),id(n2[0])
Out[9]: (4509371784, 4506651648)
两个列表的内存地址(id)是不一样的,说明n2重新开辟了一片内存,所以当li2里面的元素改变后,n2里的元素并没有改变。
下面就不一样了
In [10]: li2[3][0] = '帅哥'
 
In [11]: li2
Out[11]: ['a', 2, 3, ['帅哥', 27]]
 
In [12]: n2
Out[12]: [1, 2, 3, ['帅哥', 27]]
 
In [13]: id(li2[3]),id(n2[3])
Out[13]: (4536316872, 4536316872)
 
In [15]: id(li2[3][0])
Out[15]: 4536362680    # 和li2[3]的内存地址不一样
li2[3]和n2[3]的内存地址是一样的,还是共享一个内存地址,所以一个跟着改变,另一个也会跟着变,要想解决这个问题就要用到深copy了
 
4.深copy(不太常用)
In [1]: import copy
 
In [2]: li3 = [1,2,3,['alex',27]]
 
In [3]: n3 = copy.deepcopy(li3)
 
In [4]: li3
Out[4]: [1, 2, 3, ['alex', 27]]
 
In [5]: n3
Out[5]: [1, 2, 3, ['alex', 27]]
 
In [6]: li3[3][0] = '帅哥'
 
In [7]: li3
Out[7]: [1, 2, 3, ['帅哥', 27]]
 
In [8]: n3
Out[8]: [1, 2, 3, ['alex', 27]]
可以看出,等于是完全copy了一份,除非特殊场景这个方法不常用,也不建议用,因为如果列表存的数据量特别大的话,这样深copy一份直接翻一倍,浪费空间。

 

 

 

 

转载于:https://www.cnblogs.com/lshedward/p/9912081.html

相关文章:

  • mysql高可用方案之主从架构(master-slave)
  • 中国HBase技术社区第二届MeetUp ——HBase技术解析及应用实践
  • Centos 7.4 安装 Redis 全过程
  • cocos2d-x引擎库binary版本制作(Windows环境)
  • 解决jsfl 弹出警告
  • 基于HTML5技术的电力3D监控应用(一)
  • zabbix安装源
  • 教你在 OSX 下最简单搭建 Clojure 开发环境的步骤
  • Java命令学习系列(七)——javap
  • 点滴积累【C#】---将Excel数据导入到数据库
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • JS操作DOM的几个属性与方法
  • 201771010101 白玛次仁《面向对象程序设计(Java)》第十一周学习总结
  • 【持续更新】jQuery 实用技巧
  • 学JS的心路历程-函式(五)箭头函式
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Docker入门(二) - Dockerfile
  • Java Agent 学习笔记
  • Java 网络编程(2):UDP 的使用
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • magento 货币换算
  • orm2 中文文档 3.1 模型属性
  • oschina
  • react-native 安卓真机环境搭建
  • Ruby 2.x 源代码分析:扩展 概述
  • SAP云平台里Global Account和Sub Account的关系
  • tweak 支持第三方库
  • webpack+react项目初体验——记录我的webpack环境配置
  • 测试如何在敏捷团队中工作?
  • 大快搜索数据爬虫技术实例安装教学篇
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 回流、重绘及其优化
  • 时间复杂度与空间复杂度分析
  • 实现菜单下拉伸展折叠效果demo
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 事件委托的小应用
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我看到的前端
  • 消息队列系列二(IOT中消息队列的应用)
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 白色的风信子
  • const的用法,特别是用在函数前面与后面的区别
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​比特币大跌的 2 个原因
  • #if #elif #endif
  • (1)svelte 教程:hello world
  • (C++)八皇后问题
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (三十五)大数据实战——Superset可视化平台搭建
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET MVC第三章、三种传值方式
  • .NET 发展历程
  • .net(C#)中String.Format如何使用