内存管理相关的面试一直是面试中的重点考察内容。赋值、深拷贝与浅拷贝是日常编码工作中,需要时常关注的知识点。不小心可是会写出bug哦~

赋值

先来看一段代码,下面两段代码的输出结果会是什么呢?

# case1: 字符串赋值

a = 'linker5'

b = a

a = 'test123'

print('a: {}'.format(a))

print('b: {}'.format(b))

# case2: 列表赋值

c = ['l', 'i', 'n', 'k', 'e', 'r']

d = c

c[0] = 'L'

print('c: {}'.format(c))

print('d: {}'.format(d))

思考中

a: test123

b: linker5

c: ['L', 'i', 'n', 'k', 'e', 'r']

d: ['L', 'i', 'n', 'k', 'e', 'r']

从上面结果可以看到,a的修改没有影响b,但是c的修改了影响了d。这是为什么呢?

首先,非常重要的一点:在python中,都是将“对象的引用(内存地址)”赋值给变量的。其次,在python中有6个标准数据类型,他们分为可变和不可变两类。

不可变类型:该数据类型对象所指定内存中的值不可以被改变。在改变某个对象的值时,由于其内存中的值不可以被改变,所以,会把原来的值复制一份再进行改变,这样就会计算机会开辟一段新的内存空间来存储新的值。如上文中的case1,变量b和a都是字符串对象的引用,当修改变量a或是理解为对a重新赋值时,会赋值一份再进行改变,因此不会影响对象b。

Number(数字)

String(字符串)

Tuple(元组)

可变类型:该数据类型的对象所指定的地址上面的值可以被改变,变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发生开辟新的内存地址行为。如上文中的case2,变量c是一个可变类型对象,其存储的实际是字符对象的引用地址列表,变量d是可变对象列表的另一个引用。所以当发生改变时,会直接改变c变量列表中的对象值,不会重新开辟空间。

List(列表)

Dictionary(字典)

Set(集合)

浅拷贝

首先,我们需要明确一点,浅拷贝和深拷贝之间的区别只适用于容器对象(包含其他对象的对象,如列表或类实例)。对于非容器对象没有区别,都是对象拷贝,相当于重新赋值,生成一个新的对象。

A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.

上面这段话是官方文档上的描述,有2个含义:

1)浅拷贝会创建一个新的容器对象(compound object)

2)对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)

常见的浅拷贝操作有:

使用切片操作[:]

使用工厂函数(如list/dir/set)

copy模块的copy()方法

深拷贝

A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.

上面这段话是官方文档上的描述,也是有2个含义:

1)深拷贝和浅拷贝一样,都会创建一个新的容器对象(compound object)

2)和浅拷贝的不同点在于,深拷贝对于对象中的元素,深拷贝都会重新生成一个新的对象

python深浅拷贝 面试_[面试题二]百度资深面试官:python赋值、浅拷贝与深拷贝相关推荐

  1. Python深浅拷贝!

    Python深浅拷贝! 今天博主跟大家聊一聊如何使用Python深浅拷贝!不喜勿喷,如有建议欢迎补充.讨论! 关于安装和汉化可以观看博主的这篇文章<下载安装及汉化 >以及Python系列: ...

  2. python小学生能学嘛_小学生都能学会的python(深浅拷贝)

    小学生都能学会的python(深浅拷贝) join() 把列表中的每一项用字符串拼接起来 # lst = ["汪峰", "吴君如", "李嘉欣&quo ...

  3. python数组赋值_对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解 列表赋值: >>> a = [1, 2, 3] >>> b = a >>> print ...

  4. python深浅拷贝 面试_Python面试宝典之基础篇-02

    原标题:Python面试宝典之基础篇-02 我觉得你如果正在找工作,我的Python面试宝典几期教程,你一定得花时间看完了! 题目006:说说Python中的浅拷贝和深拷贝. 点评:这个题目本身出现的 ...

  5. python深拷贝实现原理_从底层剖析Python深浅拷贝

    拷贝的用途 拷贝就是copy,目的在于复制出一份一模一样的数据.使用相同的算法对于产生的数据有多种截然不同的用途时就可以使用copy技术,将copy出的各种副本去做各种不同的操作. 值得一提的是绝大部 ...

  6. python深浅拷贝的底层理解_理解python中的深拷贝与浅拷贝

    python中浅拷贝和深拷贝的区别如下: 1. copy.copy 等价于切片[:]  浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2个列表是不同的,但是子列表指向的仍然是同一个地址 2. co ...

  7. 关于Java的Object.clone()方法与对象的深浅拷贝,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 文章 ...

  8. python深浅拷贝应用_python之深浅拷贝

    对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. print(id(n2)) 对于字典.元组.列表而言,进行赋值.浅拷贝和深拷贝时,其内存地址的变化是不同的. ...

  9. f下行到什么形成全音_乐理试题二

    乐理试题 (二) (答题时间90分钟 ) 姓名: 得分: 一. 写出下列各音的音名.(10分) 二. 音符题.(10分) 1.用一个单纯音符或附点音符代替下列各组音符.(3分) a. b. c. 2. ...

最新文章

  1. Linux教程 网络管理命令Netstat的使用
  2. Express 搭建web服务器
  3. python 可变参数 关键字参数_Python之 可变参数和关键字参数
  4. C/C++中extern的用法 ?
  5. Android开源库loopj的android-async-http的 JsonHttpResponseHandler 存在死循环GC_CONCURRENT
  6. android第三方登录appid,AndroidQQ第三方登录
  7. 编程语言API性能大比拼
  8. 4x4矩阵键盘工作原理及扫描程序_基于复杂可编程逻辑器件实现键盘接口电路的设计...
  9. GitHub Trending 长期被国人“霸榜”,国外开发者 SAY NO
  10. POJ1011 Sticks
  11. Mac cmake命令不可用-bash: cmake: command not found
  12. python编程手机_手机最强Python编程神器,在手机上运行Python
  13. EXCEL中怎样能复制公式得来的数据(选择性粘贴)
  14. mysql mrgmyisam_mysql MRG_MyISAM 引擎报错解决
  15. VMware Workstation 15 Player 社区版安装教程
  16. 前台使用viewbag
  17. 7-32 哥尼斯堡的“七桥问题”(25 分)
  18. 如何通过DAS连接GaussDB
  19. Word、Excel、PPT软件打开关闭时很慢(卡顿)的一种解决方法
  20. 双足机器人的最新就业方向:波士顿动力机器人「进厂搬砖」了!

热门文章

  1. mysql cmd 删除表_MySQL查看表和清空表的常用命令总结
  2. Django讲课笔记08:定义商城的数据模型
  3. 大数据学习笔记35:Hive - 内部表与外部表
  4. NOIP 2016(不是游记)
  5. 【BZOJ4300】绝世好题,位运算相关DP
  6. 【codevs1063NOIP04PJ】合并果子,贪心の钻石
  7. linux批量做信任,Linux 批量建立信任关系,实现ssh无password登陆的脚本
  8. 2017.9.7 骑士 思考记录
  9. 【英语学习】【English L06】U03 House L4 How much is the rent?
  10. 6a标准 api_机油最新最高标准来了!SN不再是最高标准!车主不要加错机油了!...