Python面试宝典之基础-02篇

  

  

      Python面试宝典之基础篇-02      

  

  
  

  :这个题目本身出现的频率非常高,但是就题论题而言没有什么技术含量。对于这种面试题,在   ,这样才能   ,所以回答这个题目的要点不仅仅是能够说出浅拷贝和深拷贝的区别,深拷贝的时候可能遇到的两大问题,还要说出Python标准库对浅拷贝和深拷贝的支持,然后可以说说列表,字典如何实现拷贝操作以及如何通过序列化和反序列的方式实现深拷贝,最后还可以提到设计模式中的原型模式以及它在项目中的应用。

  

浅拷贝通常只复制对象本身,而深拷贝不仅会复制对象,还会递归的复制对象所关联的对象。深拷贝可能会遇到两个问题:一是一个对象如果直接或间接的引用了自身,会导致无休止的递归拷贝;二是深拷贝可能对原本设计为多个对象共享的数据也进行拷贝.Python通过复制模块中的复制和deepcopy函数来实现浅拷贝和深拷贝操作,其中deepcopy可以通过备忘录字典来保存已经拷贝过的对象,从而避免刚才所说的自引用递归问题,此外,可以通过copyreg模块的泡菜函数来定制指定类型对象的拷贝行为。

  

deepcopy函数的本质其实就是对象的一次序列化和一次返回序列化,面试题中还考过用自定义函数实现对象的深拷贝操作,显然我们可以使用泡菜模块的转储和负载来做到,代码如下所示。

  <前>   <代码>   泡菜   
  
my_deep_copy=obj: pickle.loads (pickle.dumps (obj))   

列表的切片操作[:]相当于实现了列表对象的浅拷贝,而字典的复制方法可以实现字典对象的浅拷贝。对象拷贝其实是更为快捷的创建对象的方式,在Python中,通过构造器创建对象属于两阶段构造,首先是分配内存空间,然后是初始化。在创建对象时,我们也可以基于“原型”的对象来创建新对象,通过对原型对象的拷贝(复制内存)就完成了对象的创建和初始化,这种做法其实更加高效,这也就是设计模式中的原型模式。我们可以通过元类的方式来实现原型模式,代码如下所示。

  <前>   <代码>   复制   类PrototypeMeta(类型):   
,,      
  
,,         :   
,,,超级()。__init__ (* args, * * kwargs)   
,,,,      
     
           
           
     
     

  

  
  

  :当面试官问到这个问题的时候,一个展示自己的机会就摆在面前了。你要先反问面试官:“你说的是官方的CPython的解释器吗?”。这个反问可以展示出你了解过Python解释器的不同的实现版本,而且你也知道面试官想问的是CPython的。当然,很多面试官对不同的Python解释器底层实现到底有什么差别也没有概念,所以,   怀,揣着这份自信可以让你更好的完成面试。

  

Python提供了自动化的内存管理,也就是说内存空间的分配与释放都是由Python解释器在运行时自动进行的,自动管理内存功能极大的减轻程序员的工作负担,也能够帮助程序员在一定程度上解决内存泄露的问题。以CPython的解释器为例,它的内存管理有三个关键点:引用计数,标记清理,分代收集。

  

  :对于CPython的解释器来说,Python中的每一个对象其实就是PyObject结构体,它的内部有一个名为ob_refcnt的引用计数器成员变量。程序在运行的过程中ob_refcnt的值会被更新并藉此来反映引用有多少个变量引用到该对象。当对象的引用计数值为0时,它的内存就会被释放掉。

  <前>   <代码>      _   {   
,,_PyObject_HEAD_EXTRA   
,,Py_ssize_t ob_refcnt;   
,,   _   *   ;   
} PyObject;   

以下情况会导致引用计数加1:

  
      <李>对象被创建李   <李>对象被引用李   <李>对象作为参数传入到一个函数中李   <李>对象作为元素存储到一个容器中李
  

以下情况会导致引用计数减1:

  
      <李>用▽语句显示删除对象引用李   <李>对象引用被重新赋值其他对象李   <李>一个对象离开它所在的作用域李   <李>持有该对象的容器自身被销毁李   <李>持有该对象的容器删除该对象李
  

Python面试宝典之基础-02篇