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

Python内存管理:赋值、浅拷贝与深拷贝解析

赋值与共享资源

在Python中,直接赋值操作(如 list2 = list1)会导致两个变量共享同一个内存地址。这意味着对 list1 的修改会直接影响到 list2,因为它们指向同一个对象。

  • 注意: 赋值等于完全共享资源
  •  如果我们不希望这样完全共享,可以使用浅拷贝和深拷贝
  • 导入copy模块
list1 = [1,2,3,4,5]
print(list1)
list2 = list1
print(list2)
list1.append(6)
print(list1)
print(list2)

浅拷贝

浅拷贝通过 copy.copy() 实现,它创建一个新的对象,但只拷贝第一层的数据。嵌套层的数据仍然指向原来的内存地址。

  • 优点:拷贝速度快,占用空间少,拷贝效率高
import copy
list3 = [1,2,3,4,5,[6,7,8]]
list4 = copy.copy(list3)
print("list3内存地址:%s"%(id(list3)))
print("list4内存地址:%s"%(id(list4)))
print("list3内存嵌套地址:%s"%(id(list3[5])))
print("list4内存嵌套地址:%s"%(id(list4[5])))
list3.append(8)
list3[5].append(100)
print(list3)
print(list4)

深拷贝

深拷贝通过 copy.deepcopy() 实现,它完全拷贝所有层的数据,新对象与原对象完全不共享内存地址。

list5 = [1,2,3,4,5,[6,7,8]]
list6 = copy.deepcopy(list5)
print("list5内存地址:%s"%(id(list5)))
print("list6内存地址:%s"%(id(list6)))
print("list5内存嵌套地址:%s"%(id(list5[5])))
print("list6内存嵌套地址:%s"%(id(list6[5])))
list5.append(100)
list5[5].append(1000)
print(list5)
print(list6)

可变对象与不可变对象

可变对象(如列表、字典、集合)在修改时内存地址不变,

而不可变对象(如数值类型、字符串、元组)在修改时会生成新的对象,分配新的内存空间。

list7 = [1,2,3,4,5]
print("list7的原内存地址%s"%(id(list7)))
list7.append(5)
print("list7增加数据后的内存地址%s"%(id(list7)))int1 = 10
print("int1的原内存地址%s"%(id(int1)))
int1 = 100
print("int1的原内存地址%s"%(id(int1)))str1 = "hello"
print("str1的内存地址%s"%(id(str1)))
str1 = "nihao"
print("str1的内存地址%s"%(id(str1)))tuple1 = (1,2,3,4,5)
print("tuple1的内存地址%s"%(id(tuple1)))
tuple1 = (2,3,4,5,6)
print("tuple1的内存地址%s"%(id(tuple1)))
http://www.xdnf.cn/news/470071.html

相关文章:

  • Mendix 连接 MySQL 数据库
  • Linux动态库热加载驱动插件机制-示例
  • 国标GB28181视频平台EasyGBS助力智慧医院打造全方位视频监控联网服务体系
  • QML元素 - MaskedBlur
  • 力扣-236.二叉树的最近公共祖先
  • Elasticsearch 常用语法手册
  • 格恩朗椭圆齿轮流量计 工业流量测量的可靠之钥
  • MySQL库的操作
  • 【笔记】CosyVoice 模型下载小记:简单易懂的两种方法对比
  • vacuum、vacuum full的使用方法及注意事项
  • “禁塑行动·我先行”环保公益项目落地宁夏,共筑绿色生活新篇章
  • 4、前后端联调文生文、文生图事件
  • 趋势跟踪策略的回测
  • AI Agent开发第67课-彻底消除RAG知识库幻觉-文档分块全技巧(1)
  • pgsql14自动创建表分区
  • SpringBoot 自动装配流程
  • [Java实战]Spring Boot 3实现 RBAC 权限控制(二十五)
  • SpringBoot项目使用POI-TL动态生成Word文档
  • 去年开发一款鸿蒙Next Os的window工具箱
  • 软考软件评测师——软件工程之系统维护
  • ADS1220高精度ADC(TI)——应用 源码
  • 采用sherpa-onnx 实现 ios语音唤起的调研
  • 每周靶点:NY-ESO-1、GPC3、IL27分享
  • Linux操作
  • Oracle APEX IR报表列宽调整
  • [ctfshow web入门] web75
  • 运维实施30-FTP服务
  • 欧拉计划 Project Euler 73(分数有范围计数)题解
  • ABP User Interface-Angular UI中文详解
  • Loki的部署搭建