L
被初始化为列表。然后将引用L1
添加到L
。现在L1
和L
变量都应指向同一对象。那么,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
答案 0 :(得分:2)
您正在创建新列表。每个新列表只有一个引用者,即sys.getrefcount()
函数的参数所保存的引用。
如果要查看L
和L1
名称引用的列表对象的引用计数,则必须将这些名称传递到{ {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 L1
和L
是否位于同一包中时,您会知道它们是否不同,便笺贴在两个不同的包中。但是,如果要从其中一个粘着的袋子中移出L1
便签纸,再将其移到另一个有L
粘着它的袋子中,该怎么办?现在,您在同一个袋子上有两个便笺,所以L1
现在是正确的。
L is L1
告诉您有多少便签纸被粘在袋子上。但是您需要告诉它有关便签的信息,而不是新书包。
最后,您可以将这些袋子放入其他袋子中,或将袋子放入labeled drawers in a filing system(或sys.getrefcount()
个对象)中,dict
也将这些袋子数在内。因为便利贴不是追踪购物袋的唯一方法,对吧?