Python对象引用的所有权
引用所有权
谁持有对象引用的所有权,谁就要对对象负责。
引用的所有权对函数的返回值和参数有重大的意义。
传递引用的所有权--返回值
传递引用的所有权指的是函数把引用的所有权和返回值一起交个调用方。

把指向对象的引用返回给调用方的函数一般都会将所有权一起交给调用方。如果函数的调用方拿到了引用的所有权,那么在指向对象的引用结束时就要负起责任执 行减量操作。
生成新对象的所有函数负责把引用的所有权交给调用方。
出借引用的所有权--返回值
出借引用的所有权指的是函数只把返回值交给调用方,至于引用的所有权则只是出借。
当调用方借到引用的所有权时,就不能对这个引用调用进行减量操作了。因为借走的所有权,不能随意破坏。

借方只能在贷方的指定期限内持有对象,因为一旦过了这个期限,对象就有可能被释放。所以借方一定要遵循贷方的规矩。
在这种情况下,调用方只是借到了引用的所有权,所以引用对象的计数器不增加。
但是为什么要借给调用方而不是直接给它引用权呢?这是因为我们觉得如果调用方不想要整个对象,而是说只要对象的一部分。例如我们只取链表中的一少部分,这样的话也不用担心忘记减量操作而出现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对象引用的所有权的更多相关文章
- 基于Python对象引用、可变性和垃圾回收详解
基于Python对象引用.可变性和垃圾回收详解 下面小编就为大家带来一篇基于Python对象引用.可变性和垃圾回收详解.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. 变量不是盒子 在示例所示 ...
- Python对象引用和del删除引用
1.首先介绍下python的对象引用 1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用.即Python不允许程序员选择采用传值或传引用.Python参数传递采用的是“传对 ...
- Python对象引用问题总结
对于对象引用问题,一直是一知半解的状态,现整理以备使用. 操作不可变对象进行加减运算时,会在内存中创建新的不可变实例,不会影响原来的引用>>> c=12>>> d= ...
- 流畅的python 对象引用 可变性和垃圾回收
对象引用.可变性和垃圾回收 变量不是盒子 人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量.Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加 ...
- python对象引用和垃圾回收
变量="标签" 变量a和变量b引用同一个列表: >>> a = [1, 2, 3] >>> b = a >>> a.appen ...
- Python 对象引用、可变性和垃圾回收
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 变量不是盒子 在示例所示的交互式控制台中,无法使用"变量是盒 ...
- python 对象引用计数增加和减少的情况
对象引用计数增加的情况: 1.对象被创建:x=4 2.另外的别人被创建:y=x 3.被作为参数传递给函数:foo(x) ->会增加2 4.作为容器对象的一个元素:a=[1,x,'33'] 对象 ...
- 快速实现python c扩展模块
1 python扩展模块的组成 在python中,对于一些和系统相关的模块或者对性能要求很高的模块,通常会把这个模块C化.扩展模块中主要包含下面几个部分: init函数,函数名为:init+模块名, ...
- Python引用拷贝赋值
先安利一个网站,对学习编程很有帮助:http://www.pythontutor.com/ 可以逐行可视化执行代码,具体自行体验啦 这个网站也是我在看别人的博文时候找到的,也先贴上别人的理解吧,我觉得 ...
随机推荐
- ksh简介
-- Start 什么是 Shell 如果把 Linux 比作一个蛋,那么 Shell 就是蛋壳,我们需要通过 Shell 来使用系统. Shell 的种类 最早的 Shell 是 Bourne Sh ...
- MyBatis数据持久化(二)建立数据库会话
上篇文章中介绍了我们使用mybatis前的准备工作,并在程序中通过jdbc与mysql数据库成功建立连接,接下来介绍如何使用mybatis与数据库建立会话.我们需要以下几个步骤: 1.在build p ...
- 在 Microsoft Word 文档 中粘贴代码实现语法高亮的方法
1.下载notepad++. 2.将代码粘贴进notepad++,或者直接用notepad++打开. 3.点击顶栏 ===> 插件 ===> NppExport ===> cope ...
- Hibernate框架学习(一)——入门
一.框架是什么 1.框架是用来提高开发效率的 2.封装好了一些功能,我们需要使用这些功能时,调用即可,不需要手动实现 3.框架可以理解成一个半成品的项目,只要懂得如何驾驭这些功能即可 二.hibern ...
- 监控慢SQL
SELECT G.TARGET || ' ' || S.MACHINE || ' ' || ceil((G.LAST_UPDATE_TIME - G.START_TIME)*86400) FROM ...
- How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式
个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...
- 入门python:《Python编程快速上手让繁琐工作自动化》中英文PDF+代码
入门推荐学习<python编程快速上手>前6章是python的基础知识,通俗易懂地讲解基础,初学者容易犯错的地方,都会指出来.从第三章开始,每章都有一个实践项目,用来巩固前面所学的知识. ...
- 平凡主丛上的Yang-Mills理论
本文是复旦大学由丁青教授的暑期课程“Yang-Mills理论的几何及其应用”所作笔记,会有少许修正. 所需基础: 多元微积分学 微分方程(常微分方程,数学物理方程) 曲线曲面论(初等微分几何) 以下是 ...
- #undef 的用法
在Visual Studio2008中编写如下代码: #include <iostream> using namespace std; int main() { #define MODI ...
- STM32为什么必须先配置时钟
首先,任何外设都需要时钟,51单片机,stm32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入. 51单片机不需要配置时钟,是因为一个时钟开了之后所有的功能都可以 ...