引用所有权

谁持有对象引用的所有权,谁就要对对象负责。

引用的所有权对函数的返回值和参数有重大的意义。

传递引用的所有权--返回值

传递引用的所有权指的是函数把引用的所有权和返回值一起交个调用方。

把指向对象的引用返回给调用方的函数一般都会将所有权一起交给调用方。如果函数的调用方拿到了引用的所有权,那么在指向对象的引用结束时就要负起责任执 行减量操作。

生成新对象的所有函数负责把引用的所有权交给调用方。

出借引用的所有权--返回值

出借引用的所有权指的是函数只把返回值交给调用方,至于引用的所有权则只是出借。

当调用方借到引用的所有权时,就不能对这个引用调用进行减量操作了。因为借走的所有权,不能随意破坏。

借方只能在贷方的指定期限内持有对象,因为一旦过了这个期限,对象就有可能被释放。所以借方一定要遵循贷方的规矩。

在这种情况下,调用方只是借到了引用的所有权,所以引用对象的计数器不增加。

但是为什么要借给调用方而不是直接给它引用权呢?这是因为我们觉得如果调用方不想要整个对象,而是说只要对象的一部分。例如我们只取链表中的一少部分,这样的话也不用担心忘记减量操作而出现BUG。

占据引用的所有权--参数

当调用方把参数传递给函数时,函数优势会占据这个参数的引用所有权。当对象的引用权被占用时,调用方就没有责任对这个对象进行减量操作了。

int PyTuple_SetItem(register PyObject *op,register Py_ssize_t i,PyObject *newitem)
{
register PyObject *olditem;
register PyObject **p;
p = ((PyTupleObject *)op) -> ob_item + i;
olditem = *p;/* 取出原本存有的对象 */
*p = newitem;/* 追加到元组 */
Py_XDECREF(olditem);/* 对取出的对象进行减量操作 */
return 0;
}

上面的函数负责将元素追加到元组。其参数分别是,元组,索引,要追加的元素。

但是这里并没有给要追加的元素计数器加一,按道理来说必须加一才对。这就是占有引用的所有权。

在这个例子中,虽然是从元组引用的,但是故意不给这个引用进行增量操作,以此夺取调用方的1个计数。

其实理解起来有一些困难。当往元组里追加元素时候,实际上持有元素的不是调用方,而是元组。这样显得更加自然,用的得当能写出灵活的代码。

出借引用的所有权--参数

调用方把参数的引用权借给函数。

当函数的调用方要出借引用的所有权时,从把对象交给函数之后直到函数执行结束为止, 这段时间调用方都必须保留指向对象的引用的所有权。

对于这个对象,只要调用方有一个所有权,那么就直接把对象交给函数也无妨。但如果 调用方一个所有权也没有,那么对象就可能会被释放,因此这里必须执行增量操作来保留引 用的所有权

Python对象引用的所有权的更多相关文章

  1. 基于Python对象引用、可变性和垃圾回收详解

    基于Python对象引用.可变性和垃圾回收详解 下面小编就为大家带来一篇基于Python对象引用.可变性和垃圾回收详解.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. 变量不是盒子 在示例所示 ...

  2. Python对象引用和del删除引用

    1.首先介绍下python的对象引用 1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用.即Python不允许程序员选择采用传值或传引用.Python参数传递采用的是“传对 ...

  3. Python对象引用问题总结

    对于对象引用问题,一直是一知半解的状态,现整理以备使用. 操作不可变对象进行加减运算时,会在内存中创建新的不可变实例,不会影响原来的引用>>> c=12>>> d= ...

  4. 流畅的python 对象引用 可变性和垃圾回收

    对象引用.可变性和垃圾回收 变量不是盒子 人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量.Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加 ...

  5. python对象引用和垃圾回收

    变量="标签" 变量a和变量b引用同一个列表: >>> a = [1, 2, 3] >>> b = a >>> a.appen ...

  6. Python 对象引用、可变性和垃圾回收

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 变量不是盒子 在示例所示的交互式控制台中,无法使用"变量是盒 ...

  7. python 对象引用计数增加和减少的情况

    对象引用计数增加的情况: 1.对象被创建:x=4 2.另外的别人被创建:y=x 3.被作为参数传递给函数:foo(x)  ->会增加2 4.作为容器对象的一个元素:a=[1,x,'33'] 对象 ...

  8. 快速实现python c扩展模块

    1  python扩展模块的组成 在python中,对于一些和系统相关的模块或者对性能要求很高的模块,通常会把这个模块C化.扩展模块中主要包含下面几个部分: init函数,函数名为:init+模块名, ...

  9. Python引用拷贝赋值

    先安利一个网站,对学习编程很有帮助:http://www.pythontutor.com/ 可以逐行可视化执行代码,具体自行体验啦 这个网站也是我在看别人的博文时候找到的,也先贴上别人的理解吧,我觉得 ...

随机推荐

  1. QNX多线程同步之Barrier(屏障)

    之前和大家介绍过QNX上的线程同步方法metux和semophore,通过这两种方法可以对一个或者几个资源进行加锁,避免资源使用上的冲突.在另一种情况下,某个线程需要在其它线程完成工作后才继续执行,这 ...

  2. Quartz任务调度 服务日志+log4net打印日志+制作windows服务

    引言 现在许多的项目都需要定时的服务进行支撑,而我们经常用到的定时服务就是Quartz任务调度了.不过我们在使用定时Job进行获取的时候,有时候我们就需要记录一下自定义的日志,甚至我们还会对执行定时J ...

  3. javascript中实现继承的几种方式

    javascript中实现继承的几种方式 1.借用构造函数实现继承 function Parent1(){ this.name = "parent1" } function Chi ...

  4. kubernetes 项目

    1:CI/CD Docker: Harbor Git Jenkins 2:微服务 istio

  5. CentOS6.3从光盘安装gcc(更改yum源)[转]

    转自:http://www.linuxidc.com/Linux/2012-11/73826.htm 一.加载光盘镜像 加载本地bin-DVD镜像文件到虚拟机系统,如图所示: 二.更改yum源 1.挂 ...

  6. 【iOS开发-47】怎样下载iOS 7.1 Simulator 以及iOS 8离线的Documentation这些文件?

    (1)最官方的解决的方法 在Xcode6里面提供下载. 依照下图找到下载就可以. 一般建议把以下的自己主动检查更新和下载的框框勾起来,这样它会帮我们自己主动下载. watermark/2/text/a ...

  7. Axure7.0在OS X Yosemite(10.10)中不能用的问题

    电脑升级到了10.10后发现axure7.0不能使用.解决办法也非常easy,就是又一次下载一个新的axure版本号,下载地址:http://www.axure.com/release-candida ...

  8. JavaScript中的Array对象方法调用

    方法concat for  循环与for in 循环 <html> <head> <script type="text/javascript"> ...

  9. C++写的UrlEncode和UrlDecode

    关于UrlEncode的实现(C++).网上有非常多不同的版本号.对须要编码的字符集的选取并不统一.那么究竟有没有标准呢?答案是有的.參见wiki 绝对不编码的,仅仅有字母.数字.短横线(-).下划线 ...

  10. Visual Assist X 10.8.2036的Crack破解补丁.2014.05.22 (General release.)

    说起来,VA公布上一个Genreal Release版本号已经是过春节那阵子时候的事了,时间过得真快. VA小组又给我们带来了新版本号的Visual Assist编码助手的 2036 版本号, 这个版 ...