Python 引用、浅复制和深复制

和python 相处了1年多,python 确实是一门非常方便的语言。
在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

你可能感兴趣的:(Python 引用、浅复制和深复制)