【Python】python深拷贝与浅拷贝详解(必须掌握)

简介: 【Python】python深拷贝与浅拷贝详解(必须掌握)

深拷贝和浅拷贝是python必须要掌握的内容,无论你是面试开发、测试、运维等职位,只要是python,深拷贝与浅拷贝是面试官常问的一个重要知识点。

(关注“测试开发自动化” 弓中皓,获取更多学习内容)



一、 深浅拷贝异同

相同点:

无论深拷贝还是浅拷贝都会创建一个新对象。即:拷贝出来的对象的id不同。

不同点:

浅拷贝:只拷贝了对象,对象内的元素并不会发生拷贝。

深拷贝:不仅拷贝对象,对象内的元素也会发生拷贝。


二、浅拷贝

2.1 浅拷贝举例

来看一个浅拷贝的例子:

import copy
a = [1, 2, [3, 4]]       
b = copy.copy(a)    # 浅拷贝
print(id(a))        # 输出结果:2401212115720
print(id(b))        # 输出结果:2401212116104
print(id(a[2]))     # 输出结果:1508928560
print(id(b[2]))     # 输出结果:1508928560

代码解释:

1)b通过浅拷贝a之后,a和b对象的id不同(与相同点吻合)

2)分别取a和b的第3个元素的id(第3个元素是可变对象),发现a和b的第3个元素的id值相同。说明并没有拷贝元素的id,也就是说a和b内部的元素id都是相同的。(与浅拷贝的不同点吻合)

2.2 浅拷贝修改元素值

上面说到了对象a和b内部的元素id都是相同的,那就意味着a、b对象内部的元素是同一个东西。

★重点★:但是并不代表浅拷贝下修改了a内元素元素的值,b元素内元素的值一定会发生变化,还要看被修改的值是否是可变对象:

【情况一】:如果是修改的元素是可变对象,那么修改了a内元素,b内元素会发生变化,该元素的在a、b内的id不会发生变化;

【情况二】:如果修改的元素是不可变对象,那么修改了a内元素,b内元素不会发生变化,该元素在a、b内的id会发生变化

# 情况1举例:修改的元素是可变对象
import copy
a = [1, 2, [3, 4]] 
b = copy.copy(a)     # 浅拷贝
a[2][1] = 4          # 修改a中[3, 4]元素,将3修改为4
print(a)             # 打印结果:[1, 2, [3, 4]]
print(b)             # 打印结果:[1, 2, [3, 4]]
print(id(a[2]))      # 打印结果:2561215900424
print(id(b[2]))      # 打印结果:2561215900424

代码解释:

a的元素[3, 4]是可变对象,所以修改了a元素,b元素也会同步修改,但是由于是浅拷贝,a、b内元素的id并不会发生变化。

# 情况2举例:修改的元素是不可变对象
import copy
a = [1, 2, [3, 4]]   
b = copy.copy(a)      # 浅拷贝
a[1] = 4              # 修改a中第1个位置上的元素,即将2修改为4
print(a)              # 打印结果:[1, 4, [3, 4]]
print(b)              # 打印结果:[1, 2, [3, 4]]
print(id(a[1]))       # 打印结果:1508928624
print(id(b[1]))       # 打印结果:1508928560

代码解释:

a元素的第一个元素是数值型(int类型),是不可变对象,所以修改了a元素,b并不会发生变化,a与b在第一个位置上的元素就属于两个不同的东西了,自然a、b的id就不相等。


三、深拷贝

3.1 深拷贝举例

import copy
a = [1, 2, [3, 4]]
b = copy.deepcopy(a)    # 深拷贝
print(id(a))            # 输出结果:2034433010824
print(id(b))            # 输出结果:2034433010248
print(id(a[2]))         # 输出结果:2463430159112
print(id(b[2]))         # 输出结果:2463430154184

代码解释:

1)b通过浅拷贝a之后,a和b对象的id不同(与2.1中相同点吻合)

2)分别取a和b的第3个元素的id(第3个元素是可变对象),发现a和b的第3个元素的id值不相同。说明a拷贝了元素b,也就是说a和b内部的元素id都是不同的个体。(与深拷贝的不同点吻合)

3.2 深拷贝修改值

与浅拷贝相反,可以将深拷贝也分为两种情况:

【情况一】:如果是修改的元素是可变对象,那么修改了a内元素,b内元素不会发生变化,该元素的在a、b内的id会发生变化;

【情况二】:如果修改的元素是不可变对象,那么修改了a内元素,b内元素不会发生变化,该元素在a、b内的id会发生变化(与浅拷贝相同)

# 情况1举例:修改的元素是可变对象
import copy
a = [1, 2, [3, 4]] 
b = copy.deepcopy(a)     # 深拷贝
a[2][0] = 4          # 修改a中[3, 4]元素,将3修改为4
print(a)             # 打印结果:[1, 2, [4, 4]]
print(b)             # 打印结果:[1, 2, [3, 4]]
print(id(a[2]))      # 打印结果:1975929744136
print(id(b[2]))      # 打印结果:1975929739208

代码解释:

a的元素[3, 4]是可变对象,是深拷贝,所以修改了a元素,b元素并不会同步修改。由于是深拷贝,修改a内可变对象元素,b内元素的id并不会发生变化。


欢迎点赞+关注+收藏

(关注“测试开发自动化” 弓中皓,获取更多学习内容)


相关文章
|
2月前
|
API Python
python中copy模块的使用,深拷贝和浅拷贝
python中copy模块的使用,深拷贝和浅拷贝
16 0
|
4月前
|
Python
Python教程:一文了解Python的深拷贝与浅拷贝
理解 Python 中的深拷贝(deep copy)和浅拷贝(shallow copy)是非常重要的,特别是在处理嵌套结构的数据时。让我们深入探讨这两个概念,并通过代码示例进行说明。
86 4
|
3月前
|
Python
Python 中浅拷贝(copy)和深拷贝(deepcopy)
Python 中浅拷贝(copy)和深拷贝(deepcopy)
|
5月前
|
Python
|
5月前
|
Java 程序员 Python
python学习13-面向对象的三大特征、特殊方法和特殊属性、类的浅拷贝和深拷贝
python学习13-面向对象的三大特征、特殊方法和特殊属性、类的浅拷贝和深拷贝
|
5月前
|
Python
请简述Python中的深拷贝和浅拷贝的区别?并举例说明。
【2月更文挑战第25天】【2月更文挑战第84篇】请简述Python中的深拷贝和浅拷贝的区别?并举例说明。
27 0
|
5月前
|
安全 Python
Python中的深拷贝和浅拷贝的区别
Python中的深拷贝和浅拷贝的区别
37 0
|
11月前
|
Python
93 python高级 - 深拷贝、浅拷贝
93 python高级 - 深拷贝、浅拷贝
26 0
93 python高级 - 深拷贝、浅拷贝
|
安全 Python
一文搞懂Python深拷贝与浅拷贝使用和区别
一文搞懂Python深拷贝与浅拷贝使用和区别
154 2
|
5月前
|
Python
Python 基础知识:解释 Python 中的深拷贝和浅拷贝有什么区别?
Python 基础知识:解释 Python 中的深拷贝和浅拷贝有什么区别?
75 0
下一篇
无影云桌面