面试必备(背)70道Python经典面试题

50. 深拷贝和浅拷贝有什么区别?

【参考答案】:

在创建新实例类型时使用浅拷贝,并保留在新实例中复制的值。浅拷贝用于复制引用指针,就像复制值一样。这些引用指向原始对象,并且在类的任何成员中所做的更改也将影响它的原始副本。浅拷贝允许更快地执行程序,它取决于所使用的数据的大小。

深拷贝用于存储已复制的值。深拷贝不会将引用指针复制到对象。它引用一个对象,并存储一些其他对象指向的新对象。原始副本中所做的更改不会影响使用该对象的任何其他副本。由于为每个被调用的对象创建了某些副本,因此深拷贝会使程序的执行速度变慢。

51. 如何在Python中实现多线程?

【参考答案】:

Python有一个多线程库,但是用多线程来加速代码的效果并不是那么的好,Python有一个名为Global Interpreter Lock(GIL)的结构。GIL确保每次只能执行一个“线程”。一个线程获取GIL执行相关操作,然后将GIL传递到下一个线程。

虽然看起来程序被多线程并行执行,但它们实际上只是轮流使用相同的CPU核心。

所有这些GIL传递都增加了执行的开销。这意味着多线程并不能让程序运行的更快。

52. [:: - 1}表示什么?

【参考答案】:

[:: - 1]用于反转数组或序列的顺序。

53. 什么是pep?

【参考答案】:

PEP代表Python Enhancement Proposal。它是一组规则,指定如何格式化Python代码以获得最大可读性。

54. 请简述Python中如何避免死锁?

【参考答案】:

死锁是指不同线程获取了不同的锁,但是线程间又希望获取对方的锁,双方都在等待对方释放锁,这种相互等待资源的情况就是死锁。Python语言可以使用 threading.Condition 对象,基于条件事件通知的形式去协调线程的运行,即可避免死锁。

55. python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一个线程使用解释器,跟单 cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不是“并行”。

【参考答案】:

多进程间共享数据,可以使用 multiprocessing.Value 和 multiprocessing.Array 。

56. 什么是lambda函数?它有什么好处?

【参考答案】:

lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数。lambda 函数不能包含命令,它们所包含的表达式不能超过一个。不要试图向lambda 函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。

57. python多线程与多进程的区别

【参考答案】:

在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie)。所以,有必要对每个Process对象调用join()方法 (实际上等同于wait) 。

对于多线程来说,由于只有一个进程,所以不存在此必要性。

多进程应该避免共享资源。在多线程中,我们可以比较容易地共享资源,比如使用全局变量或者传递参数。在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过共享内存和Manager的方法来共享资源。

但这样做提高了程序的复杂度,并因为同步的需要而降低了程序的效率。

58. Python里面如何拷贝一个对象? 

【参考答案】:

标准库中的copy模块提供了两个方法来实现拷贝。一个方法是copy,它返回和参数包含内容一样的对象。一个方法是使用deepcopy方法,对象中的属性也被复制。(回到问题50)

59. 介绍一下except的用法和作用?

【参考答案】:

Python的except用来捕获所有异常,因为Python里面的每次错误都会抛出一个异常,所以每个程序的错误都被当作一个运行时错误。

60. 简要描述Python的垃圾回收机制(garbage collection)。

【参考答案】:

Python在内存中存储了每个对象的引用计数(reference count)。如果计数值变成0,那么相应的对象就会小时,分配给该对象的内存就会释放出来用作他用。

偶尔也会出现引用循环(reference cycle)。垃圾回收器会定时寻找这个循环,并将其回收。举个例子,假设有两个对象o1和o2,而且符合 == o2和 == o1这两个条件。如果o1和o2没有其他代码引用,那么它们就不应该继续存在。但它们的引用计数都是1。

Python中使用了某些启发式算法(heuristics)来加速垃圾回收。例如,越晚创建的对象更有可能被回收。对象被创建之后,垃圾回收器会分配它们所属的代(generation)。每个对象都会被分配一个代,而被分配更年轻代的对象是优先被处理的。

上一页1234下一页


留言