访问列表是否会更改其引用计数?

2024-04-19 05:39:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理的原始问题是here。我想问一个与原始问题相关的附加问题(关于Python引用计数)。你知道吗

假设我有以下脚本:

from bitarray import bitarray
from array import array

list1=[bitarray('00011'), bitarray('00010'), bitarray('11011')]
list2=[array('i',[0,0,0,0]),array('i',[1,1,1,1]),array('i',[2,2,2,2])]

def calculate(l1,l2):
    result1=l1[0]&l1[1]&l1[2]
    result2=l2[0][0]+l2[1][1]+l2[2][2]
return result1, result2

print calculate(list1,list2)

当我调用calculate(list1,list2)时,list1list2或其中任何一个列表中的对象的引用计数是否在某个点发生了变化?你知道吗

澄清一下:我不是说调用calculate(list1,list2)前后的引用计数是否相同。我的意思是,如果引用计数在执行calculate(list1,list2)期间的任何一点发生变化。你知道吗


Tags: fromimport脚本l1heredefarray计数
1条回答
网友
1楼 · 发布于 2024-04-19 05:39:01

list1list2的引用计数没有改变,它们只是变量,因此是locals()命名空间中的字符串键。你知道吗

Python列出了这两个变量所指向的对象,当然,它们的引用计数在传递给函数时会发生变化。在调用函数期间,两个新的变量引用那些增加计数的列表(l1l2),当函数返回时,这些变量被清除,ref计数再次下降。你知道吗

calculate()函数中,您可以访问这两个列表的项(l1[0],等等)。项访问可以使用对象的__getitem__方法;方法在访问时是动态创建的,并保存对实例和底层函数的引用。对于作为对列表对象的另一个引用的列表,另一个临时引用计数将增加。一旦函数被调用并返回了它的值,这个方法就会被再次丢弃(没有任何东西引用它),列表的ref计数也会再次下降。你知道吗

正如delnan在评论中正确指出的那样,对于list subscription,BINARY_SUBSCR操作码优化了访问(前提是索引是一个整数),在这种特定情况下没有创建任何方法。你知道吗

python解释器在处理字节码和堆栈上的值时,总是在增加和减少引用计数。查看Python bytecode evaluation loop并计算Py_INCREFPy_DECREF出现的次数,以了解这种情况有多普遍。你知道吗

相关问题 更多 >