Có cách nào để lấy số lượng tham chiếu hiện tại của một đối tượng trong Python không?


93

Có cách nào để lấy số lượng tham chiếu hiện tại của một đối tượng trong Python không?

Câu trả lời:



64

Sử dụng gcmô-đun, giao diện của bộ thu gom rác, bạn có thể gọi gc.get_referrers(foo)để nhận danh sách mọi thứ đề cập đến foo.

Do đó, len(gc.get_referrers(foo))sẽ cung cấp cho bạn độ dài của danh sách đó: số lượng liên kết giới thiệu, chính là thứ bạn đang theo đuổi.

Xem thêm gctài liệu mô-đun .


7
Cũng cần lưu ý rằng số lượng sẽ là +1, vì danh sách gc cũng tham chiếu đến đối tượng.
Richard Levasseur

1
Tôi nghĩ @Dan rằng câu trả lời là đúng: >>> import gc >>> class Bar (): ... pass ... >>> b = Bar () >>> len (gc.get_referrers (b)) 1 >>> gc.get_referrers (b) [{'b': <__ main__.Bar instance tại 0x7f1f010d0e18>, 'Bar': <class main .Bar tại 0x7f1f010d6530>, ' builtins ': <module ' builtin ' (được xây dựng- in)>, ' package ': None, 'gc': <module 'gc' (built-in)>, ' name ': ' main ', ' doc ': None}]
Havok

2
Câu trả lời của @ tehvan ( sys.getrefcount(object)) đơn giản hơn len(gc.get_referrers(foo))nếu bạn thực sự chỉ cần số.
moi

trong qpython3 của Android, nó đưa ra câu trả lời sai. mỗi lần.
Shihab Shahriar Khan

9

gc.get_referrers()sys.getrefcount(). Tuy nhiên, thật khó để thấy làm thế nào sys.getrefcount(X)có thể phục vụ mục đích của việc đếm tham chiếu truyền thống. Xem xét:

import sys

def function(X):
    sub_function(X)

def sub_function(X):
    sub_sub_function(X)

def sub_sub_function(X):
    print sys.getrefcount(X)

Sau đó function(SomeObject)phân phối '7',
sub_function(SomeObject)giao '5',
sub_sub_function(SomeObject)giao '3' và
sys.getrefcount(SomeObject)giao '2'.

Nói cách khác: Nếu bạn sử dụng, sys.getrefcount()bạn phải biết về độ sâu của hàm. Đối với gc.get_referrers()một người có thể phải lọc danh sách các liên kết giới thiệu.

Tôi sẽ đề xuất thực hiện đếm tham chiếu thủ công cho các mục đích như "cô lập khi thay đổi", tức là "sao chép nếu được tham chiếu ở nơi khác".


5
import ctypes

my_var = 'hello python'
my_var_address = id(my_var)

ctypes.c_long.from_address(my_var_address).value

ctypes lấy địa chỉ của biến làm đối số. Ưu điểm của việc sử dụng ctypes so với sys.getRefCount là bạn không cần trừ 1 từ kết quả.


1
Mặc dù buồn cười, phương pháp này không nên được sử dụng: 1) sẽ không ai hiểu điều gì đang xảy ra khi đọc mã 2) nó phụ thuộc vào chi tiết triển khai của CPython: id là địa chỉ của đối tượng và bố cục bộ nhớ chính xác của PyObject. Chỉ cần trừ 1 từ getrefcount () nếu cần.
ead
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.