Python 引用、浅复制和深复制

本文首发于我的简书账号,最近迁移到csdn博客

在python中,一切皆对象。

python 引用

先来看一个例子

a={1:{2:3}}
b=a
b[1][2]=4
print("b=%s a=%s"%(b,a))

输出结果

b={1:{2:4}} a={1:{2:4}} 

即 修改了b,a的值也被修改了
这是因为在python中,b 和 a 指向相同的地址空间,b并不是一个新的对象,所以改变b的值也会改变a的值。
这种设计的方便在于,只需修改函数返回出的对象的值就可以同步修改到原来的值,不需要去追溯到原来的值。(个人经验)
###python 浅复制

a={1:{2:3}}
b=copy.copy(a)
c=copy.copy(a)
b[1]=4
print("b=%s a=%s"%(b,a))
c[1][2]=4
print("b=%s c=%s"%(b,c))

输出结果

b={1:4} a={1:{2:3}} 
b={1:{2:4}} c={1:{2:4}} 

即 b 其实复制的是a 的引用 并不是复制整个a的值
当a 含有子对象时且为可变对象时,修改b的子对象其实也就是在修改a的子对象,即b的子对象其实就是a的子对象。
因而对于可变对象而言,浅复制并不是完全复制,完全复制一份新的对象需要用到深复制。
###python 深复制

a={1:{2:3}}
b=copy.deepcopy(a)
c=copy.deepcopy(a)
b[1]=4
print("b=%s a=%s"%(b,a))
c[1][2]=4
print("b=%s c=%s"%(b,c))

输出结果

b={1:4} a={1:{2:3}} 
b={1:{2:4}} c={1:{2:3}} 

总结

很多时候遇到的坑其实是因为在平时没有去思考为什么导致的。

参考链接:

http://wsfdl.com/python/2013/08/16/%E7%90%86%E8%A7%A3Python%E7%9A%84%E6%B7%B1%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B5%85%E6%8B%B7%E8%B4%9D.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值