简析python深浅拷贝

1.基础知识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
a=123
b=123<br>#内存函数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() 效率高,开销少节约内存,但是数据不隔离,只复制父节点

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

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

2.2 深拷贝

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

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

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

dd=copy.deepcopy(d)

2.3 相关面试题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
"""
张三的成绩如下
 
张三={
"语文":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 @   万溪汇海  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示