您的位置:首页 > 编程语言 > Python开发

Python随记(四)列表复制 之 直接赋值 浅拷贝 和 深度拷贝的分析

2018-01-24 01:29 615 查看


Python随记(四)列表复制 之 直接赋值 浅拷贝 和 深度拷贝的分析

我的平台:Uabantu16.04+python3.6

1.三者简述

a. 直接赋值: 用等号 = ,其实就是对象的引用

b.浅拷贝: 用copy( ),拷贝父对象,但是不会拷贝内部子对象

c.深度拷贝: 用deepcopy,是采用的模块copy中的deepcopy方法,完全拷贝父对象和子对象

2.程序举例

现创建一个列表a,列表里的子对象也是列表,并进行赋值,浅拷贝,和 深度拷贝操作:



如图所示,

  b是赋值所得,

  c是浅拷贝所得,

  d是深度拷贝所得,注意在使用深度拷贝之前先要调用copy模块: import copy

此时可以看到四者的值一样

2.1直接赋值和拷贝(浅或深)之间的区别

列表a后面添加一个新的元素【0,0,0】:



可以看到,我只改变了列表a,但是b也跟着变化了,c 和 d却没有变化

说明:赋值操作其实不是真的拷贝,它只是令变量b指向了a所指向的对象,他们两个其实共同指向一个对象,类似于C++中的引用

          改变其中一个,另一个会接着改变

          而拷贝操作,无论深浅,都是相当于新建了一个新的列表,这个列表c 和 d 与源列表 a其实是独立的,所以列表c和d并无变化!

2.2浅拷贝和深度拷贝的区别

现在对列表a的子对象进行操作!比如令其第一个列表增加一个数字9,如图:



会发现,a变化是ok的,因为我们本身就在对a进行操作,b变化也是ok的,因为2.1说了它俩其实指向一个对象

但是c居然也变化了,这就是所谓浅拷贝 在何处了,父对象和a指向的对象是独立的,而子对象,比如这个列表元素[1, 2, 3]其实和a里面的子对象还是指向同一个对象!

所以浅拷贝不能说是创建了一个完全独立的新的列表,而深度拷贝,可以看出,真的就是生成了一个完全不相关的新的列表d!不管a怎么变,d列表我自岿然不动

三者区别想必大家已经清楚了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: