为什么 getRefCount 没有递增?

why getRefCount is not incremented?

L 被初始化为一个列表。然后将引用 a L1 添加到 L。现在 L1L 变量应该指向同一个对象。那为什么 sys.getrefcount() 还是 return 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

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

如果您想查看 LL1 名称引用的列表对象的引用计数,则必须传递 这些名称 进入 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

L 以 2 个引用开头:L 名称本身,以及 sys.getrefcount() 的参数。当您随后也将对象分配给 L1 时,现在又多了一个对它的引用。

不要混淆生成列表 value 的语法和存储在内存中的内容。如果你想象有两个相同的购物袋,你去商店把一包饼干放在一个袋子里,另一包相同类型的饼干放在另一个袋子里,是这两个包是一样的东西吗?它们看起来一样,你可以吃那些饼干,它们尝起来一样,但它们仍然是两个独立的袋子里面有饼干。如果有人偷了其中一个袋子,您仍然可以用另一个袋子来吃剩下的饼干。

在Python中写[1, 2, 3]告诉Python制作一个新的购物袋(列表)并放入一些饼干(整数).那个新包看起来和其他包(列表)一样,所以它们有相同的 value (== returns True),但是它们不是同一个包包(is 不 return True)。

现在,在这些袋子上写上 post-it 注释,给袋子起名字。在一张纸条上写L,贴在一个袋子上。在另一张纸条上写上L1,贴在另一个袋子上。它们的值仍然相同,但是当你问 Python 如果 LL1 是同一个包时,那么你知道它们不是,post-它的注释是粘在两个不同的袋子上。但是,如果您要将那张 L post-it note 从它所粘的一个袋子中移出,然后将其移到另一个粘有 L1 的袋子中怎么办?现在你在同一个包上有两个 post-it 注释,所以 L is L1 现在是真的。

sys.getrefcount() 告诉你有多少 post-it 笔记有粘在袋子上。但是你需要告诉它关于post-it notes, not new bags.

最后,你可以把那些袋子放在其他袋子里,或者把袋子放在 labeled drawers in a filing system(或 dict 个物体)里,getrefcount() 也会计算这些。因为 post-it notes 并不是追踪购物袋的唯一方式,对吧?