我正在处理的原始问题是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)
时,list1
、list2
或其中任何一个列表中的对象的引用计数是否在某个点发生了变化?你知道吗
澄清一下:我不是说调用calculate(list1,list2)
前后的引用计数是否相同。我的意思是,如果引用计数在执行calculate(list1,list2)
期间的任何一点发生变化。你知道吗
list1
和list2
的引用计数没有改变,它们只是变量,因此是locals()
命名空间中的字符串键。你知道吗Python列出了这两个变量所指向的对象,当然,它们的引用计数在传递给函数时会发生变化。在调用函数期间,两个新的变量引用那些增加计数的列表(
l1
和l2
),当函数返回时,这些变量被清除,ref计数再次下降。你知道吗在
calculate()
函数中,您可以访问这两个列表的项(l1[0]
,等等)。项访问可以使用对象的__getitem__
方法;方法在访问时是动态创建的,并保存对实例和底层函数的引用。对于作为对列表对象的另一个引用的列表,另一个临时引用计数将增加。一旦函数被调用并返回了它的值,这个方法就会被再次丢弃(没有任何东西引用它),列表的ref计数也会再次下降。你知道吗正如delnan在评论中正确指出的那样,对于list subscription,
BINARY_SUBSCR
操作码优化了访问(前提是索引是一个整数),在这种特定情况下没有创建任何方法。你知道吗python解释器在处理字节码和堆栈上的值时,总是在增加和减少引用计数。查看Python bytecode evaluation loop并计算
Py_INCREF
和Py_DECREF
出现的次数,以了解这种情况有多普遍。你知道吗相关问题 更多 >
编程相关推荐