[随笔重写] Python3 的深拷贝与浅拷贝
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 可看出
- 简单的赋值只是将引用传给新对象,新旧对象除变量名外毫无区别
- 原对象中非第一层的可变元素发生变化时,浅拷贝的新对象中的对应元素同步变化
- 深拷贝的新对象是一个真正的副本,不随原对象的改变而改变
补充
- 拷贝后的新对象占用新的空间,但其内部的元素指向原对象内部对应元素的地址
- 原对象中非第一层的不可变元素重新生成时,浅拷贝的新对象中的对应元素保持不变
[随笔重写] Python3 的深拷贝与浅拷贝的更多相关文章
- Python3的深拷贝和浅拷贝
a = 1 b = a a = 2 print(a, b) print(id(a), id(b)) """ 运行结果 2 1 1445293568 1445293536 ...
- [Python3 填坑] 009 深拷贝与浅拷贝
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python3.7 官方文档 2.2 赋值.切片与 copy() 分析 分析 分析 分析 2.3 copy 模块 分析 分析 2.4 小 ...
- Objective-C中的深拷贝和浅拷贝
在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把 ...
- $.extend()的深拷贝和浅拷贝详细讲解
版权声明:作者原创,转载请注明出处! 语法:jQuery.extend( [deep ], target, object1 [, objectN ] ) 描述: 将两个或更多对象的内容合并到第一个对象 ...
- [C#进阶系列]专题一:深入解析深拷贝和浅拷贝
一.前言 这个星期参加了一个面试,面试中问到深浅拷贝的区别,然后我就简单了讲述了它们的之间的区别,然后面试官又继续问,如何实现一个深拷贝呢?当时只回答回答了一种方式,就是使用反射,然后面试官提示还可以 ...
- 设计模式_11_原型模式(prototype)深拷贝、浅拷贝
设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...
- 浅析C#深拷贝与浅拷贝
1.深拷贝与浅拷贝 拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...
- 浅析C#深拷贝与浅拷贝(转)
1.深拷贝与浅拷贝 拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...
- java对象克隆以及深拷贝和浅拷贝
1.什么是"克隆"? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不 ...
随机推荐
- aidl 详解
aidl 是 android interface define language 的缩写,主要是作为进程间通讯的一个接口规范,这种通讯是一种普通的 client-server 的模式,对于 clien ...
- [跨界思考|瑞典|IKEA]有意思的宜家|IKEA
来自北欧瑞典的IKEA无疑是成功的企业.根据我最近几天的去宜家的体验和来自网上的资料,我发现IKEA不止是成功的企业,而且可以说是一家独特又伟大的公司. 说到IKEA,就不得不说下它的创始人:坎普拉德 ...
- 【u-boot-2018.05】make配置过程分析
https://blog.csdn.net/q_z_r_s/article/details/80718518 从u-boot-2014.10版本引入Kbuild系统之后,Makefile的管理和组织跟 ...
- java打印树形目录结构
import java.io.File; public class MainTest { public static void main(String[] args) { String dirname ...
- Vscode添加谷歌Debug插件
1. 2.安装好 Debugger for Chrome之后,找到要进行Debug的文件 3. 4.进入到launch.json文件中进行相应的配置 配置文件内容如下: { "version ...
- 【Luogu5293】[HNOI2019] 白兔之舞
题目链接 题目描述 略 Sol 考场上暴力 \(O(L)\) 50分真良心. 简单的推一下式子,对于一个 t 来说,答案就是: \[\sum_{i=0}^{L} [k|(i-t)] {L\choose ...
- 利用雅虎ycsb对cassandra做性能测试
准备: 环境: 两台虚拟机:ip:192.168.138.128/129;配置:2核4G: 版本:apache-cassandra-3.10 ycsb-cassandra-binding-0.1 ...
- 【leetcode】1143. Longest Common Subsequence
题目如下: Given two strings text1 and text2, return the length of their longest common subsequence. A su ...
- Day_02-Python的分支结构和循环结构
分支结构 应用场景 迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种结构的代码我们称之为顺序结构.然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家 ...
- CF G. Orientation of Edges BFS
来两遍 $BFS,$ 都贪心一下即可. #include <bits/stdc++.h> #define maxn 300009 using namespace std; void set ...