
ویدیو مربوط به این مقاله: (کلیک کن)
تو پایتون، وقتی یه متغیر تعریف میکنی و مقداری بهش اختصاص میدی، پایتون دو کار انجام میده:
1 - یک Object در حافظه میسازه.
2 - متغیر رو به عنوان ارجاعی به اون شی استفاده میکنه.
مثال:
a = 10
اینجا متغیری به اسم a تعریف کردیم و مقدار 10 رو به اون اختصاص دادیم.
پایتون ابتدا یک Object با مقدار 10 از کلاس int ایجاد میکنه. سپس متغیر a رو به آدرس (محل) این Object در حافظه متصل میکنه. a حالا به اون شی اشاره میکنه. یعنی:
Object با مقدار 10 تو حافظه وجود داره.
متغیر a یک ارجاع به این شی هستش.
در ادامه کد زیر رو داریم:
b = a
اینجا متغیر دیگهایی به نام b با مقدار a ایجاد کردم. الان متغیر b به همون Object با مقدار 10 اشاره میکنه. پس هر دو متغیر a و b به یک Object مشترک، یعنی 10 اشاره میکنن.
در ادامه:
a = 20
مقدار a رو تغییر دادم! پایتون یک Object جدید با مقدار 20 در حافظه میسازه و a رو به این Object جدید ارجاع میده. اما b هنوز به شی قبلی با مقدار 10 اشاره میکنه.
درنهایت:
متغیرها مقادیر رو بطور مستقیم ذخیره نمیکنن.
متغیرها فقط به اشیا (Objects) در حافظه اشاره میکنن.
پایتون برای مدیریت حافظه از مدل شمارش ارجاع (Reference Counting) استفاده میکنه. در این مدل هر شی دارای یک شمارشگره که تعداد ارجاعات به اون Object رو نگه میداره. وقتی که شمارش ارجاعات به صفر میرسه، Object از حذف میشه مثال:
import sys a = [] print(sys.getrefcount(a)) # Result : 2 # چرا 2 ؟ یکی دستوری که چاپ میکنه و دیگری متغیر b = a print(sys.getrefcount(a)) # Result : 3 # چرا 3 ؟ چون متغییر <بی> اضافه شد del b print(sys.getrefcount(a)) # Result : 2 # چون الان <بی> رو حذف کردیم پس یکی از ارجاعات اون شی رو قطع کردیم، بنابراین خروجی شد 2
تو این مقاله چی یاد گرفتیم؟
مدیریت ارجاع (Reference Management): مکانیزیمی که در اون متغیرها به اشیا در حافظه ارجاع میشوند.
مدل شمارش ارجاع (Reference Counting): روشی برای مدیریت حافظه که در اون تعداد ارجاعات به اشیا شمارش میشه و وقتی که شمارش به صفر میرسه، Object از حافظه حذف میشه.