首页
社区
课程
招聘
[原创]说一说python下的赋值,深拷贝与浅拷贝
发表于: 2017-6-14 17:42 3078

[原创]说一说python下的赋值,深拷贝与浅拷贝

2017-6-14 17:42
3078

初学python的朋友一定会遇到过这个问题:

n1=123
n2=n1
n1=456
n2=?

今天就针对这个问题详细说一说赋值,深拷贝与浅拷贝

python的深拷贝浅拷贝需要分两方面来说:字符串与数字类型;其他数据类型

首先看看字符串与数字类型

对于字符串与数字类型:赋值,深拷贝,浅拷贝都是一回事儿,不用区别

import copy
# 数字、字符串
n1 = 123
print(id(n1)) #id方法的返回值就是对象的内存地址

n2 = n1 #这是赋值
print(id(n2)) 

n3 = copy.copy(n1) #这是浅拷贝
print(id(n3))    

n4 = copy.deepcopy(n1) #这是深拷贝
print(id(n3))

我们来查看下n1,n2,n3,n4的内存地址,如下图

对于字符串和数字来说,都一样,都是返回同一个内存地址,我们再来看看其他数据类型:

1、赋值,就是再创建个变量,指向原来内存地址

n1 = {"k1": "hi", "k2": 123, "k3": ["hijack", 678]}  
n2 = n1

此时的id(n1)=id(n2)和上面字符串一样


2、浅拷贝

浅拷贝,顾名思义,很浅呐,那么就是只是在内存中只额外创建第一层数据

import copy
n1 = {"k1": "hi", "k2": 123, "k3": ["hijack", 678]}  
n2 = copy.copy(n1)
print(id(n1),id(n2))

我们来看看内存地址

和赋值不同,浅拷贝的内存地址并不相同,看看图解释下



看看,是不是很浅,只创建第一层

3、深拷贝

深拷贝,顾名思义,很深呐,深到什么程度?深到除了最后一层,其余都重新创建一份(python内部对字符串和数字的优化)

import copy
n1 = {"k1": "hi", "k2": 123, "k3": ["hijack", 678]}  
n2 = copy.deepcopy(n1)
print(id(n1),id(n2))

同样n1和n2指向的内存地址肯定不一样,看看画图解释:




以上就是一些关于赋值,深拷贝浅拷贝的知识了,说的有什么不周到的还请多多指正


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1369
活跃值: (4183)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
2
我记得以前在看到个很经典的回答:
浅拷贝:
考试试卷抄别人的,但是名字照抄不修改
深拷贝:
考试试卷抄别人的,但是名字改成自己的
2017-6-14 18:07
0
雪    币: 440
活跃值: (968)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
黑手鱼 我记得以前在看到个很经典的回答: 浅拷贝: 考试试卷抄别人的,但是名字照抄不修改 深拷贝: 考试试卷抄别人的,但是名字改成自己的
经典
2017-6-14 22:02
0
游客
登录 | 注册 方可回帖
返回
//