在 Python 中获取对象的引用计数

使用 sys.getrefcount() 方法获取对象的引用计数,例如 sys.getrefcount(obj1)。 sys.getrefcount() 方法返回对象的引用计数。 该计数比预期高一,因为该方法创建了一个临时引用。

import sys


obj1 = {'id': 1, 'name': 'zadmei'}
print(sys.getrefcount(obj1))  # 👉️ 2

obj2 = obj1
print(sys.getrefcount(obj1))  # 👉️ 3

my_dict = {
    'employee': obj1,
}
print(sys.getrefcount(obj1))  # 👉️ 4

sys.getrefcount() 方法返回所提供对象的引用计数。

import sys

obj1 = {'id': 1, 'name': 'zadmei'}
print(sys.getrefcount(obj1))  # 👉️ 2

如果需要获取直接引用给定对象的对象列表,可以使用 gc.get_referrers() 方法。

import sys
import gc


obj1 = {'id': 1, 'name': 'zadmei'}


print(sys.getrefcount(obj1))  # 👉️ 2

# [{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10d34a910>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/zadmei/workspace/python/study/main.py', '__cached__': None, 'sys': <module 'sys' (built-in)>, 'gc': <module 'gc' (built-in)>, 'obj1': {'id': 1, 'name': 'zadmei'}}]
print(gc.get_referrers(obj1))

第一个对象是当前命名空间,第二个是我们声明的变量。

gc.get_referrers() 方法返回直接引用所提供对象的对象列表。

我们可以使用 id 函数或 is 运算符来检查两个变量是否引用同一个对象。

import sys


obj1 = {'id': 1, 'name': 'zadmei'}

print(sys.getrefcount(obj1))  # 👉️ 2

obj2 = obj1

print(sys.getrefcount(obj1))  # 👉️ 3

print(obj1 is obj2)  # 👉️ True

print(id(obj1))  # 👉️ 1794290485632
print(id(obj2))  # 👉️ 1794290485632

print(id(obj1) == id(obj2)) # 👉️ True

在 Python 中获取对象的引用计数

obj1 和 obj2 变量指向内存中的相同位置并引用相同的对象。

id() 函数可用于获取对象的标识。

如果我使用 del 运算符删除 obj1 变量,我们仍然会通过 obj2 变量引用它。

import sys


obj1 = {'id': 1, 'name': 'zadmei'}
obj2 = obj1

print(sys.getrefcount(obj2))  # 👉️ 3

del obj1

print(sys.getrefcount(obj2))  # 👉️ 2

print(obj2)  # 👉️ {'id': 1, 'name': 'zadmei'}

我们使用 del 运算符删除了 obj1 变量,因此 obj2 的引用计数减少到 2。

引用计数实际上是 1,但是 sys.getrefcount() 方法会创建对所提供对象的临时引用。

我们仍然可以通过 obj2 变量访问 obj1 的内容。