对象引用和垃圾回收

《Python3高级核心技术97讲,bobby》学习笔记,第六章:对象引用和垃圾回收
319阅读 · 2020-6-11 23:36发布

6.1 python中的变量

  • 先生成对象,再把变量指向对象(先申请内存空间存放值,再把python变量指针指向值)。
  • 变量如果指向一个可变对象,每生成一个新的对象会重新生成id。
  • intern机制:将小整数(例如1、"abc"等)建立全局唯一对象,后续使用时会直接使用全局唯一对象(优化机制)。
  • 参数使用可变对象的时候,可能会出现共用的情况。例如设置可变对象为默认值时(参数的默认值存放在company.__init__.__default__)。共用情况示例代码:

    class Company:
          def __init__(self,name,staffs=[]):
              self.name = name
              self.staffs = staffs
    
          def add(self, staff_name):
              self.staffs.append(staff_name)
              # self.staffs += staff_name
    
          def remove(self, staff_name):
              self.staffs.remove(staff_name)
    
      if __name__ == "__main__":
          com2 = Company("com2")
          com2.add("aaa")
          print(com2.staffs)
    
          com3 = Company("com3")
          com3.add("bbb")
          print(com2.staffs)
          print(com3.staffs)
    
      #打印:
      #['aaa']
      #['aaa', 'bbb']
      #['aaa', 'bbb']
    

6.2 ==和is的区别

  • is判断两个对象的id是否相等。
  • ==会调用__eq__魔法函数对比。

6.3 del语句和垃圾回收

  • python中垃圾算法采用引用计数。
  • del对象会使对应的引用计数减1。
  • 引用计数减到0的时候,python解释器会将对象回收。
  • __del__魔法函数:python解释器回收对象的时候会调用__del__魔法函数。