文章目录
深拷贝和浅拷贝的区别?
浅拷贝是将一个对象的引用赋给另一个对象,如果修改被赋值对象的内容,会影响原对象;深拷贝是将原对象的内容复制给另外一个对象,如果修改被赋值对象的内容,不会影响原对象。
列表和元祖有什么区别?
列表里面的元素是可以改变的,元祖里面的元素不能改变。
*args和**kwargs区别?
*args是元祖参数,将参数打包成元祖给函数调用;
**kwargs是字典参数,将参数打包成字典给函数体调用
如何随机打乱列表中的元素,不引用额外内存空间?
import random
l = [1, 2, 3, 4, 5]
random.shuffle(l)
print(l)
什么是闭包?
闭包就是,一个函数里面有一个内函数,这个函数返回了有关内函数的引用。
闭包一般可以用于创建函数。
例如创建下面的一元二次函数2x-3:
//和** 是什么符号?
//:是做完除法之后向下取整
**:是幂次函数。2**3就是2的3次方
python2和python3的range(100)的区别
python2返回列表,python3返回迭代器,节约内存
python的GIL
GIL全局解释器锁。像全局排他锁一样,GIL的目标是保证数据的一致性。
每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
线程释放GIL锁的情况: 在IO操作等可能会引起阻塞的情况下,会暂时释放GIL,但在执行完毕后,必须重新获取GIL。
Python使用多进程是可以利用多核的CPU资源的。
多线程在处理存在IO情况的时候比单线程要优秀,因为线程遇到IO阻塞时会释放GIL锁
python怎么实现多线程
threading模块
python中的垃圾回收机制
通过引用计数实现的,如果一个对象的引用次数是0,就回收这个对象
引用计数机制为主,标记-清除和分代回收两种机制为辅的策略
引用计数的问题是会出现循环引用,可以用gc模块来解决这个问题
标记-清除:对象之间的引用可以构成有向图,从根对象出发(全局变量、调用栈、寄存器)标记被引用过的对象,然后清除没被引用的对象。
分代回收:将内存分为年轻代、中年代、老年代(链表)
新创建的对象都会分配到年轻代,年轻代的链表满了之后,触发垃圾回收机制;不用收回的会放到中年代。
python中的__init__和 __new__方法
new是真正的构造方法,用于创建一个新实例,并返回这个实例
init初始化一个新实例,添加属性,不需要返回值
python的元类metaclass使用过吗?是用来解决什么问题的?
python里面实例是类的实例,类是元类的实例
一个类的类型就是元类,可以用元类来创建类
什么是python解释器?有哪些常见的解释器?
Python解释器本身也是个程序, 它是解释执行 Python代码的,所以叫解释器。
我们运行Python程序时,先运行Python解释器,通过这个解释器,去读取我们的Python程序文件,这个解释器再以机器指令语言告诉CPU如何去做。pycharm在创建新项目的时候可以选择解释器。
常见的解释器
Cpython:官网的标准解释器
IPython:在Cpython的基础上提高了交互性
PyPy:提高了执行速度(通过JIT技术),带GIL
Jython:不带GIL
为什么python会比其他语言慢?
判断数据类型:执行的时候要不断的判断数据类型,带来很大的开销
解释型语言:由解释器逐条解释执行,而编译语言可以直接把代码编译到机器码。
多线程的情况下,有GIL锁束缚性能