python 浅拷贝copy与深拷贝deepcopy 理解

一 浅拷贝与深拷贝

1. 浅拷贝

浅拷贝只复制了对象本身(即c++中的引用)。

2. 深拷贝

深拷贝创建一个新的对象,同时也会创建所有子对象的副本,因此新对象与原对象之间完全独立。

二 代码理解

1. 案例一

python 复制代码
a = 10
b = a
b = 20
print(a)
10

通过案例可以看出,a并没有改变值,因为a是数字,不可改变的,这里b=a并不是引用,所以不能改变。

2. 案例二

python 复制代码
a = [1, 25, 60, 87, 100]
b = a
b[2] = 2
print(a)
[1, 25, 2, 87, 100]

通过案例可以看出,a的值发生改变了,因为a是list,是可以改变的,所以b=a是引用,所以发生了改变。

3. 案例三

python 复制代码
import copy
a = [1, 25, 60, 87, 100]
b = copy.deepcopy(a)
b[2] = 2
print('a : ', a)
print('b : ', b)

a :  [1, 25, 60, 87, 100]
b :  [1, 25, 2, 87, 100]

通过案例可以看出,a并没有改变值,因为我使用了深拷贝,所以不发生改变。

4. 案例四

python 复制代码
import numpy as np
a = np.array([1, 2, 3, 4])
b = a
b[1] = 0
print(a)
[1 0 3 4]

通过案例可以看出,a的值发生改变了,因为a是np,是可以改变的,所以b=a是引用,所以发生了改变。

5. 案例五

python 复制代码
import numpy as np
a = np.array([1, 2, 3, 4])
b = a.copy()
b[1] = 0
print('a : ', a)
print('b : ', b)
a :  [1 2 3 4]
b :  [1 0 3 4]

通过案例可以看出,a并没有改变值,因为我使用了深拷贝,所以不发生改变。

三 总结

我们通过案例发现,只要是python可变的变量,如果使用=号赋值,就是引用,不可变的,就不是引用。当使用可变数据时候需要深拷贝才能解决问题。

python 复制代码
不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组)。
可变数据(3个):List(列表)、Dictionary(字典)、Set(集合)
np也是可变数据,但是使用深拷贝是copy方法即可

千万要注意等号的赋值含义!千万要注意等号的赋值含义!千万要注意等号的赋值含义!

相关推荐
1024奇点5 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
实名上网宋凯宣5 小时前
Django
后端·python·django
Warren2Lynch6 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
如若1237 小时前
【论文复现】CoFailMed:从零复现医学图像分割的共享失败审计,含完整代码流程与科研绘图
人工智能·python
Knight_AL7 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing037 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
by209998 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河8 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
视觉小萌新8 小时前
AI Class 3 · Chapter 1:变量、字符串、list/dict、if/for(python学习-小白版-有经验可跳过)
python·学习·list
IT召唤狮8 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php