بسیاری از برنامهنویسان هنگام کار با زبانهای سطح بالا مانند پایتون، فرض میکنند که متغیرها دقیقاً مانند زبانهای سطح پایینتری مثل C یا Rust، بهصورت مستقیم و خام در حافظه ذخیره میشوند. اما واقعیت این است که در پایتون (و بهطور خاص در پیادهسازی رایج آن یعنی CPython)، اوضاع کاملاً متفاوت است.
در این مقاله بررسی میکنیم که چرا وقتی در پایتون عبارتی مثل mem += 1000000
مینویسید، در واقع در حال تغییر یک آبجکت هستید و نه صرفاً مقدار یک عدد خام در حافظه.
مدل شیء (Object Model) در پایتون برای اعداد
در CPython، تمام انواع پایه (از جمله اعداد صحیح یا همان int
) در واقع آبجکت هستند، نه فقط دادههای خام. هر عدد صحیح در پایتون نمونهای از کلاس int
است که اطلاعاتی مانند:
- مقدار عددی (value)
- شمارندهی مرجع (reference count)
- نوع شی (type)
- سایر دادههای مدیریتی
را در خود نگه میدارد.
بنابراین وقتی شما مینویسید:
mem = 12345678
در حقیقت متغیر mem
به یک شی از نوع PyLongObject
اشاره میکند، نه به یک عدد خام ۴ یا ۸ بایتی در حافظه.
حافظه چگونه مدیریت میشود؟
در زبان C، وقتی مینویسید:
uint32_t mem = 12345678;
مقدار 12345678
مستقیماً در یک محل حافظه ۴ بایتی قرار میگیرد. اگر شما از طریق ابزارهای low-level مانند gdb
یا memory scannerها به حافظه نگاه کنید، دقیقاً آن عدد به شکل باینری دیده میشود.
اما در پایتون اگر دنبال همان عدد در RAM بگردید، احتمال زیاد هرگز پیدایش نمیکنید! چون عدد شما به عنوان بخشی از یک ساختار پیچیدهتر (شیء) ذخیره شده و ساختار آن وابسته به طراحی CPython است، نه صرفاً یک عدد در حافظه.
جمعبندی
پایتون زبانی سطح بالا با مدل حافظهی کاملاً متفاوت از زبانهایی مثل C یا Rust است. متغیرهای عددی در CPython آبجکتهایی هستند با متادیتاهای مختلف، و نه صرفاً عددی ساده در حافظه. این موضوع را هنگام بررسی حافظه، دیباگ کردن یا نوشتن ابزارهای سطح پایین در نظر داشته باشید.
اگر قصد دارید کدی بنویسید که به حافظهی سطح پایین دسترسی پیدا کند یا دادههای خام را اسکن کند، پایتون انتخاب مناسبی نیست — مگر اینکه بدانید دقیقاً در حال انجام چه کاری هستید.
دیدگاهها
برای ارسال نظر باید وارد حساب کاربری خود شوید.
اشتراکگذاری این پست: