python深浅拷贝的底层理解_python学习笔记:深浅拷贝的使用和原理

2.数据类型

在python中数据类型包括:int,bool,float,str,dict,tuble,set,list等等,

首先,我们需要知道在python中哪些是可变数据类型,哪些是不可变数据类型。可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。

用一句话来概括上述过程就是:“python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

3.对于数字和字符串来说,无论通过赋值,浅拷贝还是深拷贝,同一个值永远用的是同一个内存地址。

importcopy

a= "i love python"b=a

a1=copy.copy(a)

a2=copy.deepcopy(b)print(id(a))print(id(b))print(id(a1))print(id(a2))

#输出:2114011486192

2114011486192

2114011486192

2114011486192

4.对于字典,列表等可变对象:

例1,关于赋值,只是创建一个变量,该变量仍指向原来内存地址;

#赋值

D = {'k1':'v1','k2':123,'k3':["str1",469]}

D2=Dprint(id(D))print(id(D2))#输出:

2178677065032

2178677065032

例2,浅拷贝,

#浅拷贝

D = {'k1':'v1','k2':123,'k3':["str1",469]}

D2= copy.copy(D) #浅拷贝,额外创建第一层(变量名id改变,对象id不变,还是引用旧对象)

print(id(D))print(id(D2))print(id(D["k1"]))print(id(D2["k1"]))#输出;

1993456403784

1993456836488

1993456800856

1993456800856

例3:深拷贝,在内存中将所有的数据重新创建一份,值的存放位置不变。

D = {'k1':'v1','k2':123,'k3':["str1",469]}

D2=copy.deepcopy(D)print(id(D))print(id(D2))print(id(D["k3"]))print(id(D2["k3"]))print(id(D["k3"][0]))print(id(D2["k3"][0]))#输出:

2129861461320

2129861875016

2129863354440

2129863327624

2129861860856

2129861860856

5.应用:

#浅拷贝,改变新字典,久字典也一起改变

dict = {"cpu":[100],"mem":[200],"disk":[300]}

new_dict=copy.copy(dict)

new_dict["cpu"][0] = 90

print(new_dict)print(dict)#输出:

{'cpu': [90], 'mem': [200], 'disk': [300]}

{'cpu': [90], 'mem': [200], 'disk': [300]}

#深拷贝,改变新字典,久字典没变

dict = {"cpu":[100],"mem":[200],"disk":[300]}

new_dict=copy.deepcopy(dict)

new_dict["cpu"][0] = 90

print(new_dict)print(dict)#输出:

{'cpu': [90], 'mem': [200], 'disk': [300]}

{'cpu': [100], 'mem': [200], 'disk': [300]}

参考:

http://www.cnblogs.com/repo/p/5425774.html

http://blog.csdn.net/jerry_1126/article/details/41852591

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值