python面试题

深拷贝和浅拷贝的区别?

浅拷贝是将一个对象的引用赋给另一个对象,如果修改被赋值对象的内容,会影响原对象;深拷贝是将原对象的内容复制给另外一个对象,如果修改被赋值对象的内容,不会影响原对象。

列表和元祖有什么区别?

列表里面的元素是可以改变的,元祖里面的元素不能改变。

*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锁束缚性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值