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高可用复制管理工具 —— Orchestrator介绍

    背景 在MySQL高可用架构中,目前使用比较多的是Percona的PXC,Galera以及MySQL 5.7之后的MGR等,其他的还有的MHA,今天介绍另一个比较好用的MySQL高可用复制管理工具:O ...

  2. iOS 字典实现原理

    在目前的开发中,NSDictionary是经常被使用,不过很少人会研究字典NSDictionary底层的实现,下面我们来一起看一下NSDictionary的实现原理. 一.字典原理 字典通过使用- ( ...

  3. VisualStudio移动开发(C#、VB.NET)Smobiler开发平台——BarcodeView控件的使用方式,.Net移动开发

    BarcodeView控件 一.          样式一 我们要实现上图中的效果,需要如下的操作: 从工具栏上的“Smobiler Components”拖动一个BarcodeView控件到窗体界面 ...

  4. Linq实现左连接、右连接

    --一本错误的记录 insert into Book values('错误时怎样练成的',111)   --左连接 select s.name,b.name from student as s lef ...

  5. C#_Lamada帮助类

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  6. JavaScript技巧(未完成)

    1.在js脚本语言中使用HTML语言中的< >号,但是在XHTML中却不能使用这类符号,可以将<号转换成&lt符号(XHTML比HTML跟严格),这种做法比较不好理解,可以用 ...

  7. asp.net引用System.Speech实现语音提示

    using System; using System.Speech.Synthesis; namespace testvoice { class Program { static void Main( ...

  8. Github:failed to add file / to index

    我把Test项目上传到github上,为了截一部分图,来写博客.所以我就上传成功之后,把仓库Respository Test删除了,但是当我再次上传的时候,发现上传不上,会提示failed to ad ...

  9. rxjava切换线程避免重复代码

    .subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThrea ...

  10. Android远程桌面助手(Build 0737)

    Android Remote Displayer and Controller Build 0737, Aug 02, 2017 新增功能: 录制MP4文件,突破了Android原生180S的限制 截 ...