引用所有权

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

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

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

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

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

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

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

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

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

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

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

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

    第一步: 在微信开放平台创建安卓应用,需要输入的包名和签名就不用再提吧,不知道的自行百度. 应用创建完毕后会得到两个值:AppID.AppSecret,用这两个值来请求微信. 然后去微信开放平台的资源 ...

  2. Codeforces 959E. Mahmoud and Ehab and the xor-MST 思路:找规律题,时间复杂度O(log(n))

    题目: 解题思路 这题就是0,1,2...n-1总共n个数字形成的最小生成树. 我们可以发现,一个数字k与比它小的数字形成的异或值,一定可以取到k与所有正整数形成的异或值的最小值. 要计算n个数字的情 ...

  3. ikbc 时光机 F87 Ctrl 失灵 解决办法

    多按几次Fn+PrtSc,直至按键无错位.

  4. Linux部署之批量自动安装系统之TFTP篇

    1.         安装:yum install tftp-server –y   2.         配置tftp文件开启tftp功能   3.         开启依赖服务xinetd   4 ...

  5. 贰、js的基础(二)类型转换

    JS 数据类型转换 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把 ...

  6. .NET Framework 3.5 无法安装以下功能 安装错误:0x800F0906(客户端加域后出现)

    问题:安装错误:0x800F0906    系统安装并加域后,在安装用友软件时提示没有.net 3.5 系统为win10 但是,点击确定后,却出现了这样的错误.如下: 点击下载并安装此功能,出现了这样 ...

  7. [USACO10FEB]吃巧克力Chocolate Eating

    题目:洛谷P2985. 题目大意:有n块巧克力要吃d天,并且只能按顺序吃.一块巧克力有一个开心值,吃了就能增加开心值.一个人初始开心值为0,且每天早上开心值变为原来的一半.问如何吃巧克力才能使开心值最 ...

  8. 学习《数据科学入门》中文PDF+英文PDF+源代码

    数据科学是一个蓬勃发展.前途无限的行业,有人将数据科学家称为"21世纪头号性感职业".本书从零开始讲解数据科学工作,教授数据科学工作所必需的黑客技能,并带领读者熟悉数据科学的核心知 ...

  9. [luogu] P1772 [ZJOI2006]物流运输(动态规划,最短路)

    P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...

  10. 【Henu ACM Round#24 B】Gargari and Bishops

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果写过n皇后问题. 肯定都知道 某个点(i,j)和它在同一条对角线上的点分别是i+j的值和i-j的值相同的点. 然后会发现选择的两 ...