Python高级编程——3.深浅拷贝

来源:互联网 发布:淘宝商城铂金会员 编辑:程序博客网 时间:2024/06/08 06:50

赋值

除元祖外的组合数据类型,将一个变量赋值给另一个变量,这个过程叫做赋值赋值会导致多个变量同时指向一块内存,所以此时不管是==还是is都返回True。

所以当一个变量发生变化,另一个也随之发生变化。


但是整数型、字符串特例,这是因为在整数型中为一个变量a赋值后,a保存的是对应数值的地址,b=a则是将a中的地址传给了b,若a又被赋值,则系统为a重新分配了地址,而b中始终保存的就是原来a的地址。字符串同理。元祖一旦声明不可改变,同理整数型、字符串型。

小整型缓冲区:为一个变量赋值,若这个值在-5~256之间时,刚好处于内存中的小整型缓冲区,这是为变量赋值无需另外开辟空间,而是直接为变量分配地址,使其指向小整型缓冲区的对应值。

浅拷贝copy,分为整数型/字符串型拷贝和其他类型拷贝)

浅拷贝是对于一个对象的顶层拷贝

通俗的理解是:拷贝了第一层的引用,并没有拷贝子对象中的引用。

但是,当a发生变化时,b不会变化:

整数、字符串、元祖的浅拷贝(id相同,即拷贝时只是多个变量指向同一个地址,为a重新赋值时a的引用地址发生变化,b依然指向原来的地址,所以不会发生变化):


字符串型的浅拷贝:


元祖类型的拷贝


其他类型的浅拷贝(拷贝后id不相同,说明拷贝时是拷贝了a的引用,b与a

各自独立,a发生变化后,b不会跟着变化):



深拷贝

深拷贝是对于一个对象所有层次的拷贝(递归)。在浅拷贝时,整数型和字符串、元祖在拷贝前后的id相同,说明拷贝的是引用,即多个变量指向同一引用。若原值a发生改变,是原值的引用指向发生改变,不会使b值发生改变。而其他类型在拷贝前后虽然id发生了变化,说明是另外开辟了内存,但拷贝的也是引用,保持值的一致,b与a相对独立,不会随着a改变而改变。以上说明浅拷贝只是拷贝了顶层的引用。

而通过以下例子可以看出深拷贝和浅拷贝的区别:(a和b的id相同,即a和b符合元祖的浅拷贝,c为深拷贝,它 的id与a不同,当a元祖中的子对象(列表)发生改变时,b由于只拷贝了元祖中的内容,所以只有元祖独立了出来,子对象(列表)依然与a相关联,所以a中的列表发生变化时,b也跟着变化。c为深拷贝,c在拷贝时连同子对象彻底拷贝,也就是递归拷贝,c与a形成了完全独立,所以c不会随着a的改变而变化)



4.深拷贝与浅拷贝的区别,可用以下内存图表示


1.1.4 拷贝的其他方

注意常量类型的深浅拷贝问题(字符串、数值型、元组

原创粉丝点击