为什么 getRefCount 没有递增?
why getRefCount is not incremented?
L
被初始化为一个列表。然后将引用 a L1
添加到 L
。现在 L1
和 L
变量应该指向同一个对象。那为什么 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()
函数的参数所持有的引用。
如果您想查看 L
和 L1
名称引用的列表对象的引用计数,则必须传递 这些名称 进入 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 如果 L
和 L1
是同一个包时,那么你知道它们不是,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 并不是追踪购物袋的唯一方式,对吧?
L
被初始化为一个列表。然后将引用 a L1
添加到 L
。现在 L1
和 L
变量应该指向同一个对象。那为什么 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()
函数的参数所持有的引用。
如果您想查看 L
和 L1
名称引用的列表对象的引用计数,则必须传递 这些名称 进入 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 如果 L
和 L1
是同一个包时,那么你知道它们不是,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 并不是追踪购物袋的唯一方式,对吧?