前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >列表复制 之 直接赋值 浅拷贝 和 深度拷贝的分析

列表复制 之 直接赋值 浅拷贝 和 深度拷贝的分析

作者头像
TeeyoHuang
发布2019-05-25 22:28:56
5890
发布2019-05-25 22:28:56
举报

列表复制 之 直接赋值 浅拷贝 和 深度拷贝的分析

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列表我自岿然不动

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年01月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.三者简述
  • 2.程序举例
    • 2.1直接赋值和拷贝(浅或深)之间的区别
      • 2.2浅拷贝和深度拷贝的区别
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档