引用所有权

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

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

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

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

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

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

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

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

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

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

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

但是为什么要借给调用方而不是直接给它引用权呢?这是因为我们觉得如果调用方不想要整个对象,而是说只要对象的一部分。例如我们只取链表中的一少部分,这样的话也不用担心忘记减量操作而出现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. hiho 1572 - set.upper_bound,排序树

    链接 小Hi家的阳台上摆着一排N个空花盆,编号1~N.从第一天开始,小Hi每天会选择其中一个还空着花盆,栽种一株月季花,直到N个花盆都栽种满月季. 我们知道小Hi每天选择的花盆的编号依次是A1, A2 ...

  2. C++ 获取某一文件夹下的所有文件名

    //********************************************************************** // Method: 获取文件夹下所有文件 // Fu ...

  3. swift内存管理

    为了解决引用循环的问题. However, with ARC, values are deallocated as soon as their last strong reference is rem ...

  4. Url 简单讲解

    eg: http://sb.test.com/login?name=liming&password=twotigers 协议 http https ftp 域名 sb.test.com 则是域 ...

  5. 树上倍增求LCA

    大概思想就是,节点$i$的第$2^{j}$个父节点是他第$2^{j-1}$个父亲的第$2^{j-1}$个父亲 然后可以$O(nlogn)$时间内解决…… 没了? //fa[i][j]表示i的第2^j个 ...

  6. Generator 简介

    Generator 就是一种状态机,封装多个内部状态. 执行 Generator 函数会返回一个遍历器对象(),也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数.返回的遍历器对 ...

  7. Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  8. 2015 Multi-University Training Contest 3 hdu 5316 Magician

    Magician Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  9. 【转】C#添加修改删除文件文件夹大全

    [转]C#添加修改删除文件文件夹大全 C#添加修改删除文件文件夹大全 StreamWriter sw = File.AppendText(Server.MapPath(".")+& ...

  10. mysql索引的使用及优化方法

    数据库高级管理及优化 MySQL性能优化 优化MySQL数据库是数据库管理员和数据库开发人员的必备技能.优化MySQL,一方面是找出系统的瓶颈,提高MySQL数据库整体的性能:另一方面是合理设计结构和 ...