python的深浅拷贝-成为马老师的弟子

参考链接

骏马金龙

前提

想要了解深浅拷贝之前必须要知道可变和不可变类型,和他们的特性

不可变类型

数字 字符串 元组 不可变集合

特性:改变值,会创建新的内存空间存储数据

可变类型

列表 字典 可变列表

特性:改变值,还是引用之前的内存空间

Python引用赋值

开篇

引用赋值其实就是=,多个变量指向同一个内存空间

不可变案例

#a指向1000的内存地址
a = 1000
#b也指向1000的内存地址
b = a
#a指向了2000的地址,b指向1000的内存地址
a = 2000

可变案例

L = [333,444,555]
L[1] = 4444
#L的地址是没有变化的,但是L[1]的地址发生的变化

列表的内存

列表的内存结构图,第一层的地址是不会随内容的改变而改变的

Python深浅拷贝

注意

深浅拷贝这个概念其实是针对可变数据类型的,不可变类型就没有这个概念

深浅拷贝概念

浅拷贝

shallow copy,只拷贝第一层的数据。copy模块的copy()就是浅拷贝

深拷贝

deep copy,递归拷贝所有层次的数据,python中copy模块的deepcopy()是深拷贝

浅拷贝

只拷贝了第一层的数据,存放在另一个空间

马老师亲手给我画的图

为下列代码的内存分布图

from copy import copy
a = [1,2,3]
b = [4,5,a]
c = copy(b)

#查看id
#id不同.第一层是完全独立的
print(id(b),id(c))

#第二层还是引用的同一个列表
b[2][0] = 200
print(id(b[2]),id(c[2]))


1800001515976 1799717541960
1800000907528 1800000907528

深拷贝

完全拷贝,两个空间是完全独立的,没有一点关系了

from copy import deepcopy
a = [1,2,3]
b = [4,5,a]
c = deepcopy(b)

#全部独立
print(id(b),id(c))
print(id(b[2]),id(c[2]))

2214201160136 2216093571144
2214200551688 2214201162312
posted @ 2019-08-06 16:21  zx125  阅读(301)  评论(0)    收藏  举报