简析python深浅拷贝

1.基础知识

a=123
b=123
#内存函数id,返回变量的内存地址 id(a) id(b) c="123" d=c id(c) id(d) f=[1,2,3] g=[1,2,3] h=f id(f) id(g) id(h)

使用内存分析工具winDbg查看这两个变量的内存分布

操作步骤:

1.使用系统计算机工具程序员模式 复制粘贴id 得到16进制内存地址

2.打开winDbg粘贴16进制数据,得到内存信息

观察所得:

  • 内存地址没有改变,内存中的值变了(对原内存就地完成修改)
  • 内存地址变了,内存中值也变了(没有对内存进行修改,而是在新的内存中放置新的值)

对于数据对象,是否支持在原内存进行修改,可分为:
可变对象:列表,字典,集合(原内存,内存地址没变)
不可变对象:数字、字符串、元组(新内存,内存地址改变了)

 

2.深浅拷贝

拷贝:复制一个对象

2.1 浅拷贝

copy.copy() 效率高,开销少节约内存,但是数据不隔离,只复制父节点

为什么修改浅拷贝的数据,没有对其他数据进行影响

  • 因为不可变对象,不会发生变化,当我们讨论深浅拷贝时,只针对可变对象
dd=copy.copy(d) #字典创建新的内存
m=copy.copy("123") #字符串,整数,列表没有创建新的内存

2.2 深拷贝

copy.deepcopy() 效率低,开销大会开辟新内存,数据完全隔离,复制父子节点

所有的变量都是可以深拷贝的吗?

  • 不是,例如队列 有锁 不能拷贝

dd=copy.deepcopy(d)

2.3 相关面试题:

"""
张三的成绩如下

张三={
"语文":70,
"数学":65,
"英语":66,
"生物":69,
"政治":78,
"跳远":[1.2,1.3,1.2]
}

李四的语文成绩比张三高20,跳远成绩最后一次是1.5,其他成绩与张三一样
王舞的语文成绩比张三高10,其他成绩与张三一样

请使用最少的代码完成数据处理,使得下面的代码可以同时打印三个人的成绩
"""

import copy

zhangsan={
"语文":70,
"数学":65,
"英语":66,
"生物":69,
"政治":78,
"跳远":[1.2,1.3,1.2]
}

lisi=copy.deepcopy(zhangsan)
lisi['语文']+=20
lisi['跳远'][-1]=1.5
wangwu=copy.copy(zhangsan)
wangwu['语文']+=10


print(f"张三成绩={zhangsan}\n李四成绩={lisi},\n王舞成绩={wangwu}")

  

 

posted @ 2023-06-05 16:59  万溪汇海  阅读(6)  评论(0编辑  收藏  举报