มีวิธีรับจำนวนการอ้างอิงปัจจุบันของวัตถุใน Python หรือไม่?
มีวิธีรับจำนวนการอ้างอิงปัจจุบันของวัตถุใน Python หรือไม่?
คำตอบ:
ตามที่หลามเอกสารที่sys
โมดูลที่มีฟังก์ชั่น:
import sys
sys.getrefcount(object) #-- Returns the reference count of the object.
โดยทั่วไปสูงกว่าที่คุณคาดไว้ 1 รายการเนื่องจากการอ้างอิงอุณหภูมิของวัตถุอาร์กิวเมนต์
การใช้gc
โมดูลอินเตอร์เฟซที่จะกล้าเก็บขยะคุณสามารถเรียกได้รับรายชื่อของทุกสิ่งที่หมายถึงgc.get_referrers(foo)
foo
ดังนั้นlen(gc.get_referrers(foo))
จะให้ความยาวของรายการนั้น: จำนวนผู้อ้างอิงซึ่งเป็นสิ่งที่คุณต้องการ
ดูเพิ่มเติมเอกสารโมดูลgc
sys.getrefcount(object)
) นั้นตรงไปตรงมามากกว่าlen(gc.get_referrers(foo))
ถ้าคุณต้องการเพียงตัวเลขจริงๆ
มีgc.get_referrers()
และsys.getrefcount()
. แต่เป็นเรื่องยากที่จะดูว่าsys.getrefcount(X)
จะตอบสนองวัตถุประสงค์ของการนับอ้างอิงแบบเดิมได้อย่างไร พิจารณา:
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)
จากนั้นfunction(SomeObject)
ส่งมอบ '7'
sub_function(SomeObject)
ส่งมอบ '5'
sub_sub_function(SomeObject)
ส่งมอบ '3' และ
sys.getrefcount(SomeObject)
ส่งมอบ '2'
กล่าวอีกนัยหนึ่ง: หากคุณใช้sys.getrefcount()
คุณต้องตระหนักถึงความลึกของการเรียกใช้ฟังก์ชัน สำหรับgc.get_referrers()
คนหนึ่งอาจจะมีการกรองรายชื่อของแหล่งอ้างอิง
ฉันขอเสนอให้ทำการนับการอ้างอิงด้วยตนเองเพื่อจุดประสงค์เช่น "การแยกการเปลี่ยนแปลง" กล่าวคือ "โคลนหากอ้างอิงที่อื่น"
import ctypes
my_var = 'hello python'
my_var_address = id(my_var)
ctypes.c_long.from_address(my_var_address).value
ctypes ใช้แอดเดรสของตัวแปรเป็นอาร์กิวเมนต์ ข้อดีของการใช้ ctypes บน sys.getRefCount คือคุณไม่จำเป็นต้องลบ 1 ออกจากผลลัพธ์