谁持有对象引用的全部权,谁就要对对象负责。code
引用的全部权对函数的返回值和参数有重大的意义。对象
传递引用的全部权指的是函数把引用的全部权和返回值一块儿交个调用方。blog
把指向对象的引用返回给调用方的函数通常都会将全部权一块儿交给调用方。若是函数的调用方拿到了引用的全部权,那么在指向对象的引用结束时就要负起责任执 行减量操做。索引
生成新对象的全部函数负责把引用的全部权交给调用方。it
出借引用的全部权指的是函数只把返回值交给调用方,至于引用的全部权则只是出借。class
当调用方借到引用的全部权时,就不能对这个引用调用进行减量操做了。由于借走的全部权,不能随意破坏。引用
借方只能在贷方的指按期限内持有对象,由于一旦过了这个期限,对象就有可能被释放。因此借方必定要遵循贷方的规矩。im
在这种状况下,调用方只是借到了引用的全部权,因此引用对象的计数器不增长。
可是为何要借给调用方而不是直接给它引用权呢?这是由于咱们以为若是调用方不想要整个对象,而是说只要对象的一部分。例如咱们只取链表中的一少部分,这样的话也不用担忧忘记减量操做而出现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个计数。
其实理解起来有一些困难。当往元组里追加元素时候,实际上持有元素的不是调用方,而是元组。这样显得更加天然,用的得当能写出灵活的代码。
调用方把参数的引用权借给函数。
当函数的调用方要出借引用的全部权时,从把对象交给函数以后直到函数执行结束为止, 这段时间调用方都必须保留指向对象的引用的全部权。
对于这个对象,只要调用方有一个全部权,那么就直接把对象交给函数也无妨。但若是 调用方一个全部权也没有,那么对象就可能会被释放,所以这里必须执行增量操做来保留引 用的全部权