পাইথনে কোনও বস্তুর বর্তমান রেফ গণনা পাওয়ার কোনও উপায় আছে কি?
উত্তর:
পাইথন মতে ডকুমেন্টেশন , 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)traditionalতিহ্যবাহী রেফারেন্স গণনার উদ্দেশ্য কীভাবে কার্যকর হতে পারে তা দেখা একধরনের কাজ। বিবেচনা:
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
সিটিপস আর্গুমেন্ট হিসাবে ভেরিয়েবলের ঠিকানা নেয়। Sys.getRefCount ওপরে সিটিপস ব্যবহার করার সুবিধা হ'ল ফলাফল থেকে আপনার 1 টি বিয়োগ করার দরকার নেই।