1、列表(list)和元组(tuple)的区别
- 列表是可变类型,而元组是不可变类型。(可变类型:list、dict;不可变类型:String、int、tuple)
- 列表的执行速度比元组慢
2、浅拷贝和深拷贝的区别?
浅拷贝:浅拷贝是将一个对象拷贝到另一个对象上,并且复制引用指针指向原始对象的内存地址,所以,改变原始对象的值时,新对象的值也会跟着改变,执行的速度比深拷贝快。
深拷贝:深拷贝用于存储已复制的值,拷贝了原始对象并开辟一个新的内存存储地址,由此,当改变原始对象的值时,新对象的值不会跟着改变,两者是完全独立的。
3、python如何实现多线程?
python并不具备真正意义上的多线程,他自身提供了thread、threading多线程库包,但这并不能加速代码的运行速度;python中有一个全局解释器锁,保证了在任意的同一时刻只有一个线程在运行,线程的运行速度非常快,并且达到一定大小后快速切换到另一个线程中运行,让我们以为它是并行运行的,这种方式也增加了内存的压力。
4、python如何进行内存管理?
- 引用计数机制。python内部使用引用计数来保存内存中的对象,所有的对象都有引用计数。
- 垃圾回收机制。当一个对象的引用计数为0时,它将被垃圾收集机制处理掉;另外,解释器也会定期执行循环检测器,搜索不可访问的对象的循环并删除它们。
- 内存池机制。python提供了内存的垃圾收集机制,但是它将不可访问的内存放到内存池中而不是返回给操作系统;在小于256字节的对象是用pymalloc实现分配的,而大于的对象则使用系统的malloc。
5、当退出python程序时是否释放全部的内存?
没有。那些对其他对象具有循环引用的python模块或从全局命名空间引用的对象并不总是被释放;另外,也不会释放C库保留的内存部分,python具有自己高效的清理机制,会尝试销毁其他对象。
6、*args,**kwargs代表什么意思?
当我们不知道传递多少个参数给函数时,或者是要用列表或元组传递参数时,用*args;
当我们不确定将多少个关键字参数传递给函数时,或者要用字典作为关键字传递时,我们用**kwargs
7、闭包是什么?
在一个外部函数中定义了一个内部函数,内部函数引用了外部函数的临时变量,并且外部函数返回内部函数的引用,这样就构成了一个闭包。
8、装饰器的作用?
装饰器的本质上就是一个闭包,其功能是在不修改原函数的条件下及调用的情况下对原函数进行功能扩展,是开放封闭原则的典型代表。
9、迭代器和生成器的区别?
迭代器就是运用迭代操作的对象,遵循迭代协议(内部实现了__next__()和__iter__()方法),可以向列表一样迭代获取其中的值,但是与列表不同的是,迭代器不能一次性将数据加载到内存中,而是以一种延迟计算的方式返回元素,即调用__next__()方法返回。
生成器本质上也是一种迭代器,也实现了迭代协议,与迭代器不同的是生成器有两种实现方式,一种是通过生成器表达式,另一种是生成器函数,代码更加简洁。生成器和迭代器都是惰性可迭代对象,只能遍历一次,数据取完抛出Stopiteration异常。
|