起初,关于python的深浅拷贝,总是习惯去用传值传址的方式去考虑,发现总是get不到规律,容易记混。
python有着高度自治的内存管理,而不可变对象的内存分配,则是能省则省,就是说,无论用什么拷贝,拷贝得到的不可变对象的内存地址都与先前一样,现在想想,仍然觉得很奇怪。所以,我就干脆从可变对象和不可变对象出发,重新考虑这个问题,把拷贝的效果和对象内存地址的变化理个清楚。
经过实验,有如下结论:
从内存地址上来看,
不可变对象
无论深浅copy还是赋值,在操作完成后,新旧不可变对象的内存地址都是相同的。
区别在于可变对象
赋值操作后,完全相同;
浅copy后,最外层可变对象的地址不同,但除此之外的任何可变对象的地址都一样(没有被拷贝);
深copy后,所有可变对象的地址都不同。
所以,可以认为,python中的深浅拷贝是针对可变对象而言的。
那么,从拷贝效果(针对可变对象)上来看,
赋值是完全没有拷贝;
浅copy仅仅是肤浅地拷贝了一个外壳;
深copy是深入内部拷贝了所有对象。
ps.函数的参数传递和赋值相同,是传址