dede网站建设的个人总结,家居东莞网站建设,微信公众号第三方平台,表白网前言
本文主要介绍了python中容易面临的考试点和犯错点#xff0c;即浅拷贝与深拷贝
首先#xff0c;针对Python中的可变对象来说#xff0c;例如列表#xff0c;我们可以通过以下方式进行浅拷贝和深拷贝操作#xff1a;
import copya [1, 2, 3, 4, [a, b]]b a …前言
本文主要介绍了python中容易面临的考试点和犯错点即浅拷贝与深拷贝
首先针对Python中的可变对象来说例如列表我们可以通过以下方式进行浅拷贝和深拷贝操作
import copya [1, 2, 3, 4, [a, b]]b a # 赋值将变量a赋值给变量b
c a.copy() # 浅拷贝 或者 c copy.copy(a)
d copy.deepcopy(a) # 深拷贝print(a) # [1, 2, 3, 4, [a, b]]
print(b) # [1, 2, 3, 4, [a, b]]
print(c) # [1, 2, 3, 4, [a, b]]
print(d) # [1, 2, 3, 4, [a, b]]我们可以发现赋值、浅拷贝和深拷贝后的变量的值是一样的但他们的“内部”真的一样吗 本文就是回答这个问题的
参考
本文主要参考了哔哩哔哩视频十分钟彻底弄懂Python深拷贝与浅拷贝机制
是视频里up主推荐了一个神奇即pythontutor
列表list
结论
为了探究前言中提到的a,b,c,d是个变量是否真的一样我们借助pythontutor来进行可视化从内存的角度来进行探究 结论 赋值变量b和a是完全一样的即他们完全共享同一个内存空间a变b也会跟着变。 浅拷贝变量c只有跟a共享第二级的列表而不共享第一级列表的内容即改变a的第一层列表内容c不会变而改变a第二层列表的内容c就会跟着变了。 深拷贝变量d和a完全不共享任何内存d完全是新开辟了一个新的空间即可认为d和a是完全没有关系的改变a或者d都不会影响对方。 测试
import copya [1, 2, 3, 4, [a, b]]
b a
c copy.copy(a)
d copy.deepcopy(a)print(a:, a) # [1, 2, 3, 4, [a, b]]
print(b:, b) # [1, 2, 3, 4, [a, b]]
print(c:, c) # [1, 2, 3, 4, [a, b]]
print(d:, d) # [1, 2, 3, 4, [a, b]]a.append(5)
a[4].append(c)print(a:, a) # [1, 2, 3, 4, [a, b, c], 5]
print(b:, b) # [1, 2, 3, 4, [a, b, c], 5]
print(c:, c) # [1, 2, 3, 4, [a, b, c]]
print(d:, d) # [1, 2, 3, 4, [a, b]]结果 这里的结果也不用多解释了完全符合前面的结论
元组tuple
由于元组是不可变对象那它的浅拷贝与深拷贝会一样吗例如
import copya (1, 2, 3, 4, (a, b))
b a
c copy.copy(a)
d copy.deepcopy(a)print(a:, a)
print(b:, b)
print(c:, c)
print(d:, d)还是直接去看内存空间 结论 对于元组来说赋值、浅拷贝与深拷贝没有区别都共享同一个内存这也很好理解因为元组是不可变对象是无法对变量a进行修改的 列表与元组混合
列表里面嵌套元组
import copya [1, 2, 3, 4, (a, b)]
b a
c copy.copy(a)
d copy.deepcopy(a)print(a:, a)
print(b:, b)
print(c:, c)
print(d:, d)内存情况 结论 就算是深拷贝元组部分都是共享内存的 元组里面嵌套列表
import copya (1, 2, 3, 4, [a, b])
b a
c copy.copy(a)
d copy.deepcopy(a)print(a:, a)
print(b:, b)
print(c:, c)
print(d:, d)内存情况 结论 完全同列表的情况