问:深拷贝、浅拷贝、直接赋值的区别是什么?并举例说明

1.区别

(1)直接赋值对象的引用

(2)浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象

(3)深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象

定义说得有点抽象,简而言之:

深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用

假设B复制了A,修改A的时候,看B是否发生变化:

(1)如果B跟着也变了,说明是浅拷贝,

(2)如果B没有改变,说明是深拷贝

2.举例说明

(1)直接赋值

# 直接赋值
# 定义列表
names = ["test1","test2","test3",["kangkang","mike"],"test4","test5"]
# 直接赋值
names1 = names #无论 names中修改了什么,names与names1保持完全一致
# 修改原列表
names[1] = "test6"
names[-3][0] = "nice"
# 打印结果
print("names:",names)
print("names1:",names1)

输出结果:

names: ['test1', 'test6', 'test3', ['nice', 'mike'], 'test4', 'test5']
names1: ['test1', 'test6', 'test3', ['nice', 'mike'], 'test4', 'test5']

解析:直接赋值,names 和 names1 指向同一个对象

(2)浅拷贝

# 浅拷贝
# 定义列表
names = ["test1","test2","test3",["kangkang","mike"],"test4","test5"]
# 浅拷贝列表
names1 = names.copy()
# 修改原列表 names
names[1] = "test6"
names[-3][0] = "nice"
# 打印
print("names:",names)
print("names1:",names1)

输出结果:

names: ['test1', 'test6', 'test3', ['nice', 'mike'], 'test4', 'test5']
names1: ['test1', 'test2', 'test3', ['nice', 'mike'], 'test4', 'test5']

解析:浅拷贝,拷贝父对象,不会拷贝对象的内部的子对象,他们的子对象 Y 还是指向同一个对象

(3)深拷贝

# 深拷贝
# 引入 copy 模块
import copy
names = ["test1","test2","test3",["kangkang","mike"],"test4","test5"]
names1 = copy.deepcopy(names)
# 修改原列表
names[-3][0] = "ken"
# 打印结果
print("names:",names)
print("names1:",names3)

输出结果:

names: ['test1', 'test2', 'test3', ['ken', 'mike'], 'test4', 'test5']
names1: ['test1', 'test2', 'test3', ['kangkang', 'mike'], 'test4', 'test5']

解析:深拷贝,names 和 names1 完全拷贝了父对象及其子对象,两者完全独立

Python【每日一问】01的更多相关文章

  1. Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词

    #coding:utf-8 import os,re path = 'test' files = os.listdir(path) def count_word(words): dic = {} ma ...

  2. python每日一函数 - divmod数字处理函数

    python每日一函数 - divmod数字处理函数 divmod(a,b)函数 中文说明: divmod(a,b)方法返回的是a//b(除法取整)以及a对b的余数 返回结果类型为tuple 参数: ...

  3. Python全栈day 01

    Python全栈day 01 一.计算机认识 用户 软件,类似微信.QQ.游戏等应用程序,由程序员编写,在系统中运行,完成各种活动,方便人们使用. 操作系统,主要分为windows系统.Linux系统 ...

  4. 每日一问:Android 消息机制,我有必要再讲一次!

    坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 我 17 年的 面试系列,曾写过一篇名为:Android 面试(五):探 ...

  5. 每日一问:谈谈 volatile 关键字

    这是 wanAndroid 每日一问中的一道题,下面我们来尝试解答一下. 讲讲并发专题 volatile,synchronize,CAS,happens before, lost wake up 为了 ...

  6. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  7. 每日一问:你了解 Java 虚拟机结构么?

    对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员 ...

  8. 每日一问:LayoutParams 你知道多少?

    前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的.我们 ...

  9. 每日一问:简述 View 的绘制流程

    Android 开发中经常需要用一些自定义 View 去满足产品和设计的脑洞,所以 View 的绘制流程至关重要.网上目前有非常多这方面的资料,但最好的方式还是直接跟着源码进行解读,每日一问系列一直追 ...

  10. python每日一练:0007题

    第 0007 题: 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来. # -*- coding:utf-8 -*- import os def count ...

随机推荐

  1. Django框架(六)

    十一.Django组件-cookie与session 1.会话跟踪技术 (1) 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多 ...

  2. MapReduce(五)

    MapReduce的(五) 1.MapReduce的多表关联查询. 根据文本数据格式.查询多个文本中的内容关联.查询. 2.MapReduce的多任务窜执行的使用 多任务的串联执行问题,主要是要建立c ...

  3. FileReader字符的读出

    1.fileReader是字符的读出,只能读文件. 2.在读取文件的之前,该文件必须存在. 3.int reader();一次读取一个字符,返回的该字符的码值,如果想要返回字符,直接进行强转char ...

  4. SpringCloud服务负载均衡实现原理01

  5. Linux常用命令汇总集

    cd ./ 当前目录 ../ 上级目录 / 代表根目录 or 代表目录和文件之间的分隔符 .. pwd 查看当前路径 LS 查看当前目录下的文件 ls ./a/ 查看目标路径下的文件 tab 自动补全 ...

  6. laravel 微信小程序登录 加密解密扩展包

    https://github.com/lanceWan/wxxcx 测试的时候一定要保证服务器的 appid  和客户端的appid一致 如果是切换测试 那么需要把本地的项目从微信小程序上面删除掉 再 ...

  7. mysql数据库基础语句训练题

    ; -- ---------------------------- -- Table structure for course -- ---------------------------- DROP ...

  8. 201671010142 java类与对象的定义及使用

    通过这章学习,了解到面向对象程序设计.面向对象的程序设计是有对象组成的,每个对象对用户公开的特定功能部分和隐藏的实现部分.有类构造对象的过程称为创建类的实例.实现封装的关键在于绝对不能让类中的方法直接 ...

  9. java中的线程问题是(四)——线程同步问题

    多线程的并发,给我们编程带来很多好处,完成更多更有效率的程序.但是也给我们带来线程安全问题. 解决问题的关键就是要保证容易出问题的代码的原子性,所谓原子性就是指:当a线程在执行某段代码的时候,别的线程 ...

  10. Python基础02_基本数据类型_以及while

    基本数据类型: 字符串: 字符串可以相加, 表示连接; 可以将字符串乘以某个数,表示将此字符串复制多少次. 数: 数的加减乘除取余等. 需要注意的是两个乘号**和两个除号/ / python2中的除法 ...