和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}}
总结
很多时候遇到的坑其实是因为在平时没有去思考为什么导致的。