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

python---深拷贝浅拷贝

赋值

lis1 = [1,2,3,4,5]
lis2  = lis1 #将lis1赋值给lis2
#给lis1新增元素
lis1.append(6)
print('新增后的lis1',lis1)
print('新增后的lis2',lis2)
#新增后的lis1 [1, 2, 3, 4, 5, 6]
#新增后的lis2 [1, 2, 3, 4, 5, 6]

赋值后完全共享资源,一个值改变另一个也会改变 

浅拷贝

会创建新的对象,拷贝最外层对象,嵌套层会指向原来的内存地址,

import copy  #导入copy模块
li = [1,2,3,[4,5]]  #定义嵌套列表
li2 = copy.copy(li)
print(li)
print(li2)
#查看内存地址
print('li的内存地址是',id(li))
print('li2的内存地址是',id(li2)) 
#[1, 2, 3, [4, 5]]
# [1, 2, 3, [4, 5]]
# li的内存地址是 1856588308288
# li2的内存地址是 1856588305792

内存地址不一样,说明不是同一个对象

li .append(6) #给li添加元素看看li2会不会随之改变
print('li',li)
print('li2',li2)
# li [1, 2, 3, [4, 5], 6]
# li2 [1, 2, 3, [4, 5]]

给嵌套列表添加元素

li[3].append(8)
print('li',li)
print('li2',li2)
# li [1, 2, 3, [4, 5, 8], 6]
# li2 [1, 2, 3, [4, 5, 8]]

说明li与li2嵌套列表内层地址是一样的

总结:浅拷贝外层的内存地址不一样,但是内层的内存地址相同

浅拷贝优点:拷贝速度快,占用空间小,拷贝效率高

深拷贝

外层对象和内部的元素都拷贝了一遍(数据完全不共享)

深拷贝数据变化只影响自己本身

创建一个完全独立的新对象,递归地复制对象及其子对象,确保新对象与原对象完全独立。修改原对象不会影响深拷贝的对象。

import copy
lis1 = [1, 2, 3,[4,5]]
lis2 = copy.deepcopy(lis1)  #深拷贝
#外层添加元素7
lis1.append(7)
print('lis1外层列表添加元素',lis1,id(lis1))
print('lis2外层列表添加元素',lis2,id(lis2))# lis1外层列表添加元素 [1, 2, 3, [4, 5], 7] 2943579811968
# lis2外层列表添加元素 [1, 2, 3, [4, 5]] 2943579805312#嵌套层添加元素6
lis1[3].append(6)
print('lis1内层列表添加元素',lis1,id(lis1[3]))
print('lis2内层列表添加元素',lis2,id(lis2[3]))# lis1内层列表添加元素 [1, 2, 3, [4, 5, 6], 7] 2943579804480
# lis2内层列表添加元素 [1, 2, 3, [4, 5]] 2943579805056

 

http://www.jsqmd.com/news/53267/

相关文章:

  • 解决ARM Linux下使用PlatformIO 找不到编译工具链toolchain报错
  • 搜维尔科技:新一代Xsens Link动作捕捉系统,非常适合实时机器人远程操控、虚拟制作和现场演出录制
  • 解决VirtualBox - Error In supR3HardenedWinReSpawn报错
  • 1127随笔
  • 大规模微服务强大的系统中的雪崩故障防治
  • flutter 生命周期管理:从 Widget 到 State 的完整解析 - 指南
  • gradle的各个环境依赖jar包的同一个版本导致的严重后果
  • 20251127
  • Day26字体图标--上传矢量图
  • 从零开始:用Python和Gemini 3四步搭建你自己的AI Agent
  • 双特异性抗体:抗癌 “双面手”,两种模式精准杀伤癌细胞
  • 机器翻译模型跨领域自适应技术解析
  • 高级程序语言第七次作业
  • windows和linux下jar包graalvm打包生native程序 - yebinghuai-qq
  • 2025.11.27
  • 赋能第一期 新员工角色转换主题培训
  • 从技术管理者到战略决策者,揭秘IT技术负责人的四个价值层次,看看您在第几层?
  • DS优化建图
  • 深入解析:Leetcode 43
  • 十一月份《代码大全》观后感二
  • 解读Spring Boot框架中不同位置抛出异常的处理流程
  • docker离线安装emqx(麒麟aarch64)
  • tips:LVGL 定时器触发周期不准确(实际间隔 设定间隔)问题排查与解决方案
  • 云斗学院 NOIP 考前练手公益赛 Round 1 题目分析
  • 第6章 基于应变的单轴疲劳分析 11
  • C++写有一个2D 小游戏(贪吃蛇)
  • NOIP day -2 笔记
  • 专精
  • 对比说明Java NIO框架和传统的IO框架的优缺点
  • CF2157C Meximum Array 2