-
-
[原创]说一说python下的赋值,深拷贝与浅拷贝
-
发表于:
2017-6-14 17:42
3191
-
[原创]说一说python下的赋值,深拷贝与浅拷贝
初学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指向的内存地址肯定不一样,看看画图解释:
以上就是一些关于赋值,深拷贝浅拷贝的知识了,说的有什么不周到的还请多多指正
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课