背景介绍:以下是我在准备Python开发工程师面试时准备的一些常问的题目!其中几个题目是我在面试时经常被问到的,比如深浅拷贝,多线程多进程;也有一些题目是我之前从来没听过,在面试的时候第一次听,然后记下来,网上搜索答案记录的!很多问题其实也是很好的引导,大家在学习Python的时候可以由问题带着思考,能学到不少。(ps.红色字体是我一个学姐给我做的批注)
欢迎大家打印复习,点赞收藏哦!
1 深拷贝和浅拷贝的区别是什么?
浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。
1、赋值:简单地拷贝对象的引用,两个对象的id相同。
2、浅拷贝:创建一个新的组合对象,这个新对象与原对象共享内存中的子对象。
3、深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联。虽然实际上会共享不可变的子对象,但不影响它们的相互独立性。
Python中浅拷贝和深拷贝的区别?
copy.copy()浅拷贝:拷贝了对象,但拷贝对象的值仍然是指向原对象的值(相当于引用),修改拷贝对象的元素,则被拷贝对象的值也会被修改。
copy.deepcopy()深拷贝: 不仅拷贝了对象,同时也拷贝了对象中的元素,获得了全新的对象,与被拷贝对象完全独立;但这需要牺牲一定的时间和空间。
import copy
>>> a = [[1, 2],[5, 6], [8, 9]]
>>> b = copy.copy(a) # 浅拷贝得到b
>>> c = copy.deepcopy(a) # 深拷贝得到c
>>> print(id(a), id(b)) # a 和 b 不同
139832578518984 139832578335520
>>> for x, y in zip(a, b): # a 和 b 的子对象相同
... print(id(x), id(y))
...
139832578622816 139832578622816
139832578622672 139832578622672
139832578623104 139832578623104
>>> print(id(a), id(c)) # a 和 c 不同
139832578518984 139832578622456
>>> for x, y in zip(a, c): # a 和 c 的子对象也不同
... print(id(x), id(y))
...
139832578622816 139832578621520
139832578622672 139832578518912
139832578623104 139832578623392
深拷贝和浅拷贝的主要区别在:子对象的Id也不同,在实际中有什么应用吗?
如果把某个列表或者字典变量通过浅拷贝的方式赋值给另一个变量,如果其中一个发生变化则另一个也会变化,而深拷贝则不会。如果要求两个变量只是初始值一样,但需要二者执行不同的指令,则需要深拷贝。
2简述多线程、多进程?
对于python来讲,线程共享的是进程的资源,它本身无法调度多核(多CPU ),多线程运算适用于高输入输出的非CPU密集型运算,比如调用外部接口、加载数据等操作;多进程可以调度多核(多CPU)进行运算,单个进程中可以有多个线程,进程间相互独立,适用于CPU计算密集型运算,比如矩阵的加减乘除运算。
进程和线程的概念
- 当一个程序进入内存运行时,即变成一个进程(Process)。进程是系统进行资源分配和调度的一个独立单位。—— 进程三特征:
- 独立性:进程是系统中独立存在的实体,拥有自己独立的资源和地址空间;
- 动态性:进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中执行的指令集合,进程具有自己的生命周期和状态;
- 并发性:多个进程可以在单个处理器上并发执行,互不影响。(与并行不是一个概念)
线程(Thread)是进程的执行单元,独立、并发的执行流,被称为轻量级进程。
- 线程可以拥有自己的堆栈、自己的程序计数器、自己的局部变量,但不拥有系统资源
- 一个进程中可以有多个线程,它们共享该进程的全部资源
- 多个线程并发地执行
进程:
- 操作系统进行资源分配和调度的基本单位,多个进程之间相互独立。
- 稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
线程:
- CPU 进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
- 如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线