引用

python中,在对对象赋值,参数传递,函数返回等等, 都是引用传递的. 直接copy个例子来【1】:

a = [1, 2, 3]

b = a

b.append(5)

print a, b

输出结果为:

[1, 2, 3, 5] [1, 2, 3, 5]

面的结果有助于理解引用的实际情况。 具体查看一个对象的引用数,可以使用sys.getrefcount(ojb)获取,但这个函数有点邪恶,有时似乎并不给出正确的结果,正常来说获取的值都比你想要的大,一般是大1,因为给这个函数传参数也算一个引用。但有时会大得离谱,来例子:

import sys

a = "a"

sys.getrefcount(a)

在我的机器上,输出结果尽然为14,网络遛了一圈,有人说是python内部对“a”这个对象进行了应用。好吧!就这样理解把,有高见的可以留言告我一下!

拷贝【1】

拷贝主要有两种拷贝,分别以copy模块中的两个函数copy和deepcopy为代表。其中,前者复制对象本身,但对于对象中得元素,还是会使用的原本引用,copy个例子来:

list_of_lists = [ ['a'], [1, 2], ['z', 23] ]

copy_lol = copy.copy(lists_of_lists)

copy_lol[1].append('boo')

print list_of_lists, copy_lol

输出结果为:

[['a'], [1, 2, 'boo'], ['z', 23]] [['a'], [1, 2, 'boo'], ['z', 23]]

考到第二个元素的情况了 把!用的还是引用。要想全部对对象本省进行拷贝,就得使用deepcopy了。

对象回收

Python使用了垃圾回收器来自动销毁那些不再使用的对象。当对某个对象的引用计数为0时, Python能够安全地销毁这个对象。表面上看来,在使用C或者C++时经常会碰到的内存泄露问题似乎也就解决了,但实际的情况是,请你小心!再copy个例子来【2】:

class LeakTest(object):

def __init__(self):

print 'Object with id %d born here.' % id(self)

def __del__(self):

print 'Object with id %d dead here.' % id(self)

def foo():

A = LeakTest()

B = LeakTest()

A.b = B

B.a = A

if __name__ = ="__main__":

foo()

运行结果为:

Object with id 10462448 born here.

Object with id 10462832 born here.

在构造一个类时,__init__会被自动调用;在进行对象回收时,__del__会被调用。很清楚的看到对象只是被创建了,而没有被回收,原因很简单,A和B的由于互相引用,他们的引用次数是不可能为0的,自然被回收也是不可能的了。这是,就应该考虑弱引用了。

弱引用

这是相对上面“引用”的一个概念,主要不同体现在对象回收时,上面我只提到当引用数为0,对象就会自动回收。其实还有另外一种情况,当自由只有对对象的弱引用时,对象也是会被回收。直接上代码,对上例做出一些修改:

import weakref

class LeakTest(object):

def __init__(self):

print 'Object with id %d born here.' % id(self)

def __del__(self):

print 'Object with id %d dead here.' % id(self)

def foo():

A = LeakTest()

B = LeakTest()

A.b = weakref.proxy(B)

B.a = weakref.proxy(A)

if __name__ = ="__main__":

foo()

运行结果为:

Object with id 28637456 born here.

Object with id 29402736 born here.

Object with id 28637456 dead here.

Object with id 29402736 dead here.

OK了,对象被正常回收了!最后简单解说wekref中得几个函数【3】:

1.创建弱引用:

你可以通过调用weakref模块的ref(obj[,callback])来创建一个弱引用,obj是你想弱引用的对象,callback是一个可选的函数,当因没有引用导致Python要销毁这个对象时调用。回调函数callback要求单个参数(弱引用的对象)。

一旦你有了一个对象的弱引用,你就能通过调用弱引用来获取被弱引用的对象。下面的例子创建了一个对socket对象的弱引用:

>>> from socket import *

>>> import weakref

>>> s=socket(AF_INET,SOCK_STREAM)

>>> ref=weakref.ref(s)

>>> s

>>> ref

>>> ref() #调用它来访问被引用的对象

2. 创建代理对象

代理对象是弱引用对象,它们的行为就像它们所引用的对象,这就便于你不必首先调用弱引用来访问背后的对象。通过weakref模块的proxy(obj[,callback])函数来创建代理对象。使用代理对象就如同使用对象本身一样:

>>> from socket import*

>>> import weakref

>>> s=socket(AF_INET,SOCK_STREAM)

>>> ref=weakref.proxy(s)

>>> s

>>> ref

>>> ref.close() #对象的方法同样工作 callback参数的目的和ref函数相同。在Python删除了一个引用的对象之后,使用代理将会导致一个weakref.ReferenceError错误:

>>> del s

>>> ref

Traceback (most recent call last):

File "", line 1, in ?

3. getweakrefcount(obj)和getweakrefs(obj)分别返回弱引用数和关于所给对象的引用列表

参考文献:

python对象回收_python 引用,拷贝,对象回收,弱引用相关推荐

  1. python gc教程_python中的垃圾回收(GC)机制

    一.引用计数 Python 垃圾回收以引用计数为主,分代回收为辅.引用计数法的原理是每个对象维护一个ob_refcnt,用来记录对象被引用的次数,也就是用来追踪有多少个引用指向了对象,当发生以下四种情 ...

  2. python内置类型_Python内置对象类型

    核心数字类型: 数字:int,long,float,complex,bool 字符:str,unicode 列表:list 字典:dict 元组:tuple 文件:file 其他类型:集合(set), ...

  3. python语言的内置对象类型_Python内置对象类型

    核心数字类型: 数字:int,long,float,complex,bool 字符:str,unicode 列表:list 字典:dict 元组:tuple 文件:file 其他类型:集合(set), ...

  4. ThreadLocalMap中为什么valu是强引用,不是弱引用

    这里假设value和threadlocal都是弱引用,假如threadlocal除了 被Entry这个弱引用所引用之外,还被强引用(使用threadLocal时threadLocal对象肯定是被强引用 ...

  5. java引用 弱引用_了解Java弱引用

    java引用 弱引用 我最近没来得及关注这个博客,最重要的是,我没有为与技术界的所有人保持联系而致歉. 最近,我偶然发现了自Java 1.2起可用的java.lang.ref软件包,但具有讽刺意味的是 ...

  6. python花式编码_Python——花式打印对象的若干种方法

    今天是Python专题的第10篇文章,我们来聊聊Python当中的类. 打印实例 我们先从类和对象当中最简单的打印输出开始讲起,打印一个实例是一个非常不起眼的应用,但是在实际的编程当中却非常重要.原因 ...

  7. python 类组合_python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...

  8. python花式输出_Python——花式打印对象的若干种方法

    今天是Python专题的第10篇文章,咱们来聊聊Python当中的类.编程 打印实例 咱们先从类和对象当中最简单的打印输出开始讲起,打印一个实例是一个很是不起眼的应用,可是在实际的编程当中却很是重要. ...

  9. python展开面_python面度对象(属性,类方法,静态方法)

    一. 属性 所谓的属性,就是将一个类中的方法伪装成一个属性.在代码的级别是没有任何本质上的提升.但是让代码看起来更顺眼. property 装饰器函数,内置函数,帮助你将类中的方法伪装成属性(特性). ...

  10. python self 序列_python中序列化对象

    # 序列化对象p1 import pickle                               # 内置库 class People: def __init__(self, name, a ...

最新文章

  1. Sublime text 3 汉化教程
  2. 深度学习中几种常见的激活函数理解与总结
  3. 通过Blazor使用C#开发SPA单页面应用程序(4) - Ant Design
  4. H.Minimum-cost Flow
  5. python经典书籍推荐:Python核心编程
  6. 前端性能优化(一)-- 文件的压缩与合并
  7. tushare+画图
  8. bp神经网络模型的优缺点,什么是BP神经网络模型?
  9. VM虚拟机安装orcle数据库
  10. Istio对接虚拟机
  11. 浅谈Spring事件监听
  12. 学期博客:学习进度条
  13. C++学习路线图(新)
  14. valgrind安装及使用
  15. 用户留存统计 java_用户留存率以及DNU、DAU、WAU、MAU关系
  16. 计算机键盘句号,句号怎么打_键盘句号怎么打_句号怎么打在电脑上-Guide信息网...
  17. 静态库路径配置g2o
  18. iWatch应用开发-oc篇
  19. 刷屏了!高校硕士毕业论文研究“董明珠的自恋对企业的影响” 网友:这也行?...
  20. 计算机四级考试从零开始,从零开始考公务员,这些步骤要学会!

热门文章

  1. mybatis mysql merge into_整合DRUID数据源+MyBatis
  2. matlab中未定义与 ‘cell‘ 类型的输入参数相对应的运算符 ‘+‘ 的解决方案
  3. 火狐浏览器59.0.1英文版如何改为中文版界面
  4. (转)关于CNN中平移不变性的理解
  5. 用OSSIM平台轻松发现“心脏出血”漏洞
  6. 【十一】Jmeter 函数助手实战:__time 时间戳函数
  7. css设计引言,HTML5与CSS3设计模式 引言(3)
  8. oracle脚本加并发,定时执行ORACLE脚本,并发邮件到指定邮箱
  9. 手把手教你启动若依前后端分离项目
  10. Spring Boot快速搭建Web开发框架(Hibernate+Thymeleaf)