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:
Theo tài liệu Python , sys
mô-đun chứa một hàm:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
Nói chung là 1 cao hơn bạn có thể mong đợi, vì tham chiếu tạm thời đối tượng.
Sử dụng gc
mô-đ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 gc
tài liệu mô-đun .
sys.getrefcount(object)
) đơn giản hơn len(gc.get_referrers(foo))
nếu bạn thực sự chỉ cần số.
Có gc.get_referrers()
và 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".
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ả.