[随笔重写] Python3 的深拷贝与浅拷贝
2024-10-17 08:38:57
1. Python3 关于深浅拷贝的官方文档
- 文档地址:Python3.7.2
- 源码地址:lib/copy.py
2. 先说结论
- 深拷贝与浅拷贝是对复合对象而言的
- 深拷贝会构造一个新的复合对象,然后递归地将在原始对象中所有元素的副本对应地写入新复合对象中
- 浅拷贝会构造一个新的复合对象,然后(在允许的前提下)向其中写入对原始对象的引用
3. 开始分析
- 复合对象:包含其他对象的对象,如列表、类实例等
- 模块、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口、数组等不能被拷贝
- 示例
# 例1
import copy # 导入 copy 模块
list1_1 = [0, 1, 2, ['a', 'b']]
list1_2 = list1_1 # 赋值
list1_3 = list1_1.copy() # 浅拷贝;同 list1_3 = list1_1[:]
list1_4 = copy.copy(list1_1) # 浅拷贝
list1_5 = copy.deepcopy(list1_1) # 深拷贝
# 打印出拷贝后的 list1_1 ~ list1_5
print("list1_1 =", list1_1)
print("list1_2 =", list1_2)
print("list1_3 =", list1_3)
print("list1_4 =", list1_4)
print("list1_5 =", list1_5)
print('-'*40) # 分割线
list1_1.append(4) # 在 list1_1 末尾添加一个元素 4
list1_1[3].append('c') # 向 list1_1 中内嵌的列表末尾添加一个元素 'c'
# 打印出更改后的 list1_1 ~ list1_5
print("list1_1' =", list1_1)
print("list1_2' =", list1_2)
print("list1_3' =", list1_3)
print("list1_4' =", list1_4)
print("list1_5' =", list1_5)
>>>
list1_1 = [0, 1, 2, ['a', 'b']]
list1_2 = [0, 1, 2, ['a', 'b']]
list1_3 = [0, 1, 2, ['a', 'b']]
list1_4 = [0, 1, 2, ['a', 'b']]
list1_5 = [0, 1, 2, ['a', 'b']]
----------------------------------------
list1_1' = [0, 1, 2, ['a', 'b', 'c'], 4]
list1_2' = [0, 1, 2, ['a', 'b', 'c'], 4]
list1_3' = [0, 1, 2, ['a', 'b', 'c']]
list1_4' = [0, 1, 2, ['a', 'b', 'c']]
list1_5' = [0, 1, 2, ['a', 'b']]
由例1 可看出
- 简单的赋值只是将引用传给新对象,新旧对象除变量名外毫无区别
- 原对象中非第一层的可变元素发生变化时,浅拷贝的新对象中的对应元素同步变化
- 深拷贝的新对象是一个真正的副本,不随原对象的改变而改变
补充
- 拷贝后的新对象占用新的空间,但其内部的元素指向原对象内部对应元素的地址
- 原对象中非第一层的不可变元素重新生成时,浅拷贝的新对象中的对应元素保持不变
最新文章
- MongoDB Java Driver
- 今天开始着手原来Office系统的重构
- 查询分页的几种Sql写法
- 4D数据介绍
- (转载)SQLServer存储过程返回值总结
- start-stop-daemon 命令
- [置顶] 深圳华为BSS公共部件 (BI 商业智能 Java Javascript)
- openjpa框架入门_Demo概览(一)
- javascript 基础 onclick(this)用法介绍
- Match类解析
- Eclipse中删除tomcat server 导致不能重新创建该版本的tomcat server
- 牛客小白月赛1 A-简单题
- 利用SQL Profiler 追踪数据库操作
- STM32 USB 鼠标+键盘 串口控制
- eclipse安装STS遇到的问题
- MySql查询时间段的方法(转)
- 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0
- centos7上使用locate命令
- linux下根目录扩容
- (字符串)最长公共字串(Longest-Common-SubString,LCS)
热门文章
- 【u-boot-2018.05】make配置过程分析
- L5 Swagger 使用说明
- centos .7x service iptables save 错误解决方案
- 【python基础】集合方法汇总
- vue-cli3热更新配置,解决热更新失败的问题,保存代码浏览器自动刷新
- luogu 4147 玉蟾宫 悬线DP
- win php composer安装
- matplotlib中中文字体配置
- C++ 对象间通信框架 V2.0 ××××××× 之(五)
- Count on a tree(树上路径第K小)