为什么getRefCount不递增?

2024-09-30 06:20:03 发布

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

L初始化为列表。然后将引用a 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

Tags: 对象falsetruel1列表issys指向
1条回答
网友
1楼 · 发布于 2024-09-30 06:20:03

您正在创建新的列表。每个新列表只有一个引用,即参数对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以两个引用开始:L名称本身和sys.getrefcount()的参数。当您同时将对象分配给L1时,现在又有一个对它的引用。你知道吗

不要混淆产生列表值的语法和存储在内存中的内容。如果你想象有两个相同的购物袋,你去商店把一包饼干放在一个袋子里,另一包同样类型的饼干放在另一个袋子里,这两个袋子是一样的吗?它们看起来是一样的,你可以吃那些饼干,它们的味道也一样,但是它们仍然是两个分开的袋子,里面装着饼干。如果有人偷了其中一个袋子,你还可以用另一个袋子来吃剩下的饼干。你知道吗

用Python编写[1, 2, 3]告诉Python制作一个新的购物袋(列表)并放入一些cookies(整数)。这个新包看起来与其他包(列表)相同,因此它们具有相同的==返回True),但它们不是相同的单个包(is不返回True)。你知道吗

现在,在那些袋子上贴上便条,写上袋子的名字。把L写在一张纸条上,贴在一个袋子上。把L1写在另一张纸条上,贴在另一个袋子上。它们的值仍然是相同的,但是当您询问Python如果LL1是同一个包,那么您就知道它们不是,post-it注释被粘贴到两个不同的包中。但是如果你把那张L贴的便条从粘在上面的一个袋子里移到粘在上面的另一个袋子里呢?现在您在同一个包上有两个便笺,因此L is L1现在是真的。你知道吗

sys.getrefcount()告诉你有多少便笺贴在袋子上。但是你需要告诉它关于便笺,而不是新的袋子。你知道吗

最后,你可以把这些袋子放在其他袋子里,或者把袋子放在labeled drawers in a filing system(或者dict对象)里,而getrefcount()也会把它们计算在内。因为便利贴不是追踪购物袋的唯一方法,对吧?你知道吗

相关问题 更多 >

    热门问题