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

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

1.三者简述

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

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

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

2.程序举例

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

deeptables可以在pytorch上运行吗_赋值

如图所示,

  b是赋值所得,

  c是浅拷贝所得,

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

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

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

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

deeptables可以在pytorch上运行吗_赋值_02

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

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

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

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

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

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

deeptables可以在pytorch上运行吗_python_03

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

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

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

三者区别想必大家已经清楚了