Python深浅拷贝教程-面试必问内容
1. 赋值
在Python中,赋值其实就是对象的引用。
a = 9999
b = a
print(a) #ouput:9999
print(b) #ouput:9999
print(id(a)) #ouput:1869259054928
print(id(b)) #ouput:1869259054928
这样赋值后,b和a不仅在值上相等,而且是同一个对象,也就是说在堆内存中只有一个数据对象9999,这两个变量都指向这一个数据对象。从数据对象的角度上看,这个数据对象有两个引用,只有这两个引用都没了的时候,堆内存中的数据对象9999才会等待垃圾回收器回收。
需要注意的是,它和下面的赋值过程是不等价的:
a = 9999
b = 9999
print(id(a)) #ouput:1869266158672
print(id(b)) #ouput:1869266158768
虽然a和b的值相等,但他们不是同一个对象,这时候在堆内存中有两个数据对象,只不过这两个数据对象的值相等。
不可变对象
对于不可变对象,修改变量的值意味着在内存中要新创建一个数据对象
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:725638078
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> a = 9999
>>> b = a
>>> id(a)
2625562451792
>>> id(b)
2625562451792
>>> a = 20000
>>> id(a)
2625564836944
>>> id(b)
2625562451792
在a重新赋值之前,b和a都指向堆内存中的同一个数据对象9999,但a重新赋值后,因为数值类型9999是不可变对象,不能在原始内存块中直接修改数据,所以会新创建一个数据对象保存20000,最后a将指向这个20000对象。这时候b仍然指向9999,而a则指向20000。
可变对象
对于可变对象,比如列表,它是在"原处修改"数据对象的。比如修改列表中的某个元素,列表的地址不会变,还是原来的那个内存对象,所以称之为"原处修改"。
例如:
>>> L1 = [1,2,3]
>>> L2 = L1
>>> L1[0] = 999
>>> L1,L2
([999, 2, 3], [999, 2, 3])
>>> id(L1)
2625562620872
>>> id(L2)
2625562620872
在L1[0]赋值的前后,数据对象[1,2,3]的地址一直都没有改变,但是这个列表的第二个元素的值已经改变了。因为L1和L2都指向这个列表,所以L1修改第一个元素后,L2的值也相应地到影响。也就是说,L1和L2仍然是同一个列表对象。
面试中会可能遇到的问题:
1.为啥一直在用9999这个数?
答:
9是我的幸运数字
Python深浅拷贝教程-面试必问内容相关推荐
- 面试必问的 Linux 命令帮你整理好啦 (下)
如果我说 Linux 操作系统和命令是面试必问的,你相信么?不信,我们来看看企业招聘需求: 随便在某招聘网站上搜了一下测试工程师的技能要求,基本都有 Linux 操作系统和命令的要求.说明,这个技能确 ...
- 互联网公司面试必问的Redis题目
https://juejin.im/post/5b99d4bce51d450e7a24b66e#heading-0 Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用 ...
- linux驱动工程面试必问知识点
linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...
- Android面试必问框架原理
Android面试必问框架原理 volatile的实现原理 synchronized的实现原理 join方法实现原理 CAS无锁编程的原理 ReentrantLock的实现原理 AQS的大致实现思路 ...
- 看完946页“JAVA高级架构面试必问”,金九银十社招全拿下
前言 我本科毕业后在老东家干了两年多,老东家算是一家"小公司"(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找坑的时 ...
- 面试必问一:Java 中 == 和 equals 的区别你知道吗
面试必问一:Java 中 == 和 equals 的区别你知道吗 前言 关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本 ...
- 互联网公司面试必问的mysql题目(下)
这是mysql系列的下篇,上篇文章地址我附在文末. 什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构.一个非常恰 ...
- 2022大厂面试必问要点总结
Hi,大家好,又到了一年一度的"金三银四",圈子里的朋友都在为跳槽做准备,每个人都想抓住机会跳槽大厂涨薪升职.近段时间来咨询面试.进阶.跳槽问题的朋友也越来越多. ↑后台留言 仅最 ...
- 为什么换工作?(面试必问问题)
为什么换工作?(面试必问问题) 最好的回答: 对老东家,我要回老家发展.对新东家,老东家要搬迁,做好要搬去哪里的回答.千万不能提钱,买不起房之类的抱怨,咬紧嘴巴,打死就这么一个理由. 次好回答: 对老 ...
最新文章
- mysql在win服务器上安装linux_MySql数据安装Linux+Windows
- Oracle数据库表导出和导入csv文件操作
- java 线程 wait 一定要同步_Java 线程中调用wait为什么一定要在同步代码块中?
- 【数据结构与算法】之深入解析“复制带随机指针的链表”的求解思路与算法示例
- Python高级运维开发2016年7月第14期隆重开课
- Framework打包
- 《C++ Primer》2.6.1节练习
- C语言中sizeof和strlen的区别是什么
- 四.因子图优化学习---对因子图优化的粗浅理解
- gettid()和pthread_self()的区别
- 如何设置Eclipse新建项目的默认编码方式
- Android基础 写给新手的Android环境配置
- hasp运行不成功_HASP加密狗驱动程序没有安装成功如何解决
- Java 反射 面试题
- CMOS版图课程第七讲--可靠性设计,视频截图节选
- 绝地求生主播御用手机雷达分屏
- Kettle工具简单使用(spoon)
- c语言中的空字符常量,c习题编译时出现空的字符常量,怎么修改?
- Google 电子表格函数列表
- C-V2X行业现状、产业化部署与演进路线
热门文章
- 面试必问的 Linux 命令帮你整理好啦 (下)