为什么getRefCount不增加?

时间:2019-01-10 17:08:34

标签: python python-internals reference-counting

L被初始化为列表。然后将引用L1添加到L。现在L1L变量都应指向同一对象。那么,sys.getrefcount()为什么仍返回1?

>>> L = [1,2,3]
>>> L1 = [1,2,3]
>>> L==L1
True
>>> L is L1
False
>>> sys.getrefcount([1,2,3])
1
>>> L1 = L
>>> L1 is L
True
>>> sys.getrefcount([1,2,3])
1

1 个答案:

答案 0 :(得分:2)

您正在创建列表。每个新列表只有一个引用者,即sys.getrefcount()函数的参数所保存的引用。

如果要查看LL1名称引用的列表对象的引用计数,则必须将这些名称传递到{ {1}}函数:

sys.getrefcount()

>>> import sys >>> L = [1,2,3] >>> sys.getrefcount(L) 2 >>> L1 = L >>> L1 is L True >>> sys.getrefcount(L) 3 >>> sys.getrefcount(L1) 3 以2个引用开头:L名称本身和L的参数。然后,当您还将对象分配给sys.getrefcount()时,现在又有一个引用。

不要混淆生成列表 value 的语法与存储在内存中的内容之间的混淆。如果您想象有两个相同购物袋,然后去商店将一小包饼干放在一个袋子中,将另一包相同类型的小包放在另一个袋子中,则是两个袋子同样的事情?它们外观相同,您可以吃那些饼干,它们也可以品尝相同,但它们仍然是两个装有饼干的独立袋子 。如果有人偷了其中一个袋子,那么您仍然会有另一个袋子来吃剩下的饼干。

在Python中书写L1告诉Python创建一个 new 购物袋(列表)并放入一些cookie(整数)。该新包装袋看起来与其他包装袋(列表)相同,因此它们具有相同的 value [1, 2, 3]返回==),但它们不是同一包装袋( True不返回is)。

现在,在那些袋子上贴上便笺,给袋子起名字。将True写在一张纸上,然后粘在一个袋子上。将L写在另一个音符上,然后贴在另一个包上。它们的值仍然相同,但是当您询问Python L1L是否位于同一包中时,您会知道它们是否不同,便笺贴在两个不同的包中。但是,如果要从其中一个粘着的袋子中移出L1便签纸,再将其移到另一个有L粘着它的袋子中,该怎么办?现在,您在同一个袋子上有两个便笺,所以L1现在是正确的。

L is L1告诉您有多少便签纸被粘在袋子上。但是您需要告诉它有关便签的信息,而不是新书包。

最后,您可以将这些袋子放入其他袋子中,或将袋子放入labeled drawers in a filing system(或sys.getrefcount()个对象)中,dict也将这些袋子数在内。因为便利贴不是追踪购物袋的唯一方法,对吧?