python中的垃圾回收采用计数算法

一个对象如果被引用N次,则需要N次(即计算引用次数为零时)执行del 才能回收此对象。

a = 100
b = a
del a
print(b)
print(a) 100
NameError: name 'a' is not defined

在函数和类中如果传递参数的时候,很有可能参数会做一些改变,一下为一个经典的坑:

    

def add(a, b):
a += b
return a
a = [1,2]
b = [3,4]
c = add(a,b )
print(b)
print(a)
print(c) [3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
在传递为可变对象list时候,函数内部可以对全局变量引用并改变。但是如果传递参数为不可变对象时,原参数就不会发生改变。 class Company():
def __init__(self, name, staffs=[]):
self.name = name
self.staffs = staffs
def add(self, staff_name):
self.staffs.append(staff_name)
def remove(self, staff_name):
self.staffs.remove(staff_name)
if __name__ == '__main__':
com1 = Company('company1', ['bobby1', 'bobby2'])
com1.add('bobby3')
com1.remove('bobby1')
print(com1.staffs) com2 = Company('company2')
com2.add('bobby')
print(com2.staffs)
print(Company.__init__.__defaults__) com3 = Company('company3')
com3.add('bobby5')
print(com2.staffs)
print(com3.staffs)
print(com2.staffs is com3.staffs) ['bobby2', 'bobby3']
['bobby']
(['bobby'],)
['bobby', 'bobby5']
['bobby', 'bobby5']
True

代码解释:在因为com2没有指定list参数于是调用的默认参数。默认参数可以用print(Company.__init__.__defaults__)打印出来看到,当执行com2.add('bobby')之后,可以看到Campany类的默认参数已经变成了(['bobby'],),于是后面的com3在实例化的时候,由于没有带list参数,就会指向默认参数,即['bobby']。

总结:在函数或类方法中要尽量避免传递可变的类型参数。

Python中的垃圾回收与del语句的更多相关文章

  1. Python中的垃圾回收机制

    Python的垃圾回收机制 引子: 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,所以 ...

  2. 【转载】Python中的垃圾回收机制

    GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...

  3. Python 中的垃圾回收机制--备忘

    GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...

  4. Python 中的垃圾回收机制(转载)

    from: https://foofish.net/python-gc.html GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来 ...

  5. Python中的垃圾回收机制(转)

    原文:https://foofish.net/python-gc.html GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他 ...

  6. Python 中的垃圾回收机制

    GC作为现代编程语言的自动内存管理机制,专注于两件事:1. 找到内存中无用的垃圾资源 2. 清除这些垃圾并把内存让出来给其他对象使用.GC彻底把程序员从资源管理的重担中解放出来,让他们有更多的时间放在 ...

  7. python中的垃圾回收机制及原理

    序言: 来一起看看: 不同于C/C++,像Python这样的语言是不需要程序员写代码来管理内存的,它的GC(Garbage Collection)机制 实现了自动内存管理.GC做的事情就是解放程序员的 ...

  8. python内存管理&垃圾回收

    python内存管理&垃圾回收 引用计数器 环装双向列表refchain 在python程序中创建的任何对象都会放在refchain连表中 name = '张三' age = 18 hobby ...

  9. 【java虚拟机序列】java中的垃圾回收与内存分配策略

    在[java虚拟机系列]java虚拟机系列之JVM总述中我们已经详细讲解过java中的内存模型,了解了关于JVM中内存管理的基本知识,接下来本博客将带领大家了解java中的垃圾回收与内存分配策略. 垃 ...

随机推荐

  1. 关于mysql-connector-net和C#.net

    mysql-connector-net-8.0.11.msi 可以从这里下载:mysql-connector-net-8.0.11   如果使用ado.net链接mysql数据库则只需要引用  MyS ...

  2. win10 git bash 闪退

    使用ghost重装了win10 专业版后.安装git,尝试重装了n个版本的git,右键git bash here 直接闪退,直接进入安装目录打开git-bash.exe依旧闪退, git右键点击Git ...

  3. 【20190129】CSS-垂直水平居中相关

    元素居中是HTML和CSS永恒的问题,记录一下我使用的居中方法: 1. 块状元素水平居中,主要用于页面整体布局:   margin: 0 auto; 2. 文字水平居中,适用于内联元素或inline- ...

  4. 浅谈OA系统与Portal门户的区别

    随着社会信息化的发展与进步,OA办公自动化软件打破了传统复杂的办公方式,使各个行业实现了高效的无纸化办公.由此一来OA快速成长为继财务软件.ERP软件之后的第三大管理软件.随着企业信息化系统的不断增多 ...

  5. Android Studio调试手机或者安装APK的时候出现install failed test only

    1.检查\app\src\main\AndroidMainfest.xml中是否有testOnly属性为true,如果有去掉或者改为false 2.检查Android Studio和gradle版本是 ...

  6. redis的几种数据导入导出方式【转】

    环境说明:202.102.221.11 redis源实例202.102.221.12 redis目标实例202.102.221.13 任意linux系统 一.redis-dump方式 1.安装redi ...

  7. 【NodeJS】Node.JS 开发环境安装

    1.前言 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O ...

  8. js计算剩余分钟

    // 剩余时间提醒 function checkTime() { if (timeCompare()) { document.getElementById('distanceDeadline').in ...

  9. MongoDB数据库的设计规范

    MongoDB是非关系型数据库的典型代表,DB-Engines Ranking 数据显示,近年来,MongoDB在NoSQL领域一直独占鳌头.MongoDB是为快速开发互联网应用 而设计的数据库系统, ...

  10. Linux中VSFTP的配置

    配置VSFTP服务器: 1.安装VSFTP,可以参考Linux 中yum的配置来安装: yum installvsftpd.x86_64 -y 2.修改SELinux: setenforce 0 查看 ...