تفاوت اختصاص حافظه در Interactive interpreter prompt و script file در پایتون

با عرض سلام خدمت دوستان
وقتتون بخیر
به مثال زیر دقت کنید در حالت Interactive interpreter اجرا می شود :

x=50
y=50
z=50
print(id(x),id(y),id(z))

هر سه id یکسانی دارند و این قضیه درست و عادی است . توی پایتون اگر چند متغیر با مقادیر مساوی که از 5- تا 256 هستند داشته باشیم در خانه های یکسان حافظه نگهداری می کند

پس کد زیر که در حالت Interactive interpreter اجرا شده نشان می دهد که مقادیر متغیرهای در یک خانه حافظه قرار نگرفته اند

x=123456
y=123456
z=123456
print(id(x),id(y),id(z))

و کد بالا هم نتیجه درستی است
سوال اینجاست:
اگر همین کد بالا را در یک فایل داشته باشیم و اجرا بگیریم هر سه مقدار به یک خانه حافظه اشاره می کند
چرا کد بالا در روش Interactive interpreter خانه های یکسان حافظه بهش تخصیص نمی دهد ولی در روش script file یک خانه به هرسه متغیر تخصیص می دهد ؟

کدهای فوق با پایتون 3 اجرا شده است
ممنون میشم راهنمایی کنید

پایتون به شما گارانتی نمی ده که این مقادیر رو یک جا نگه داره. وقتی به صورت interactive استفاده می کنین. عملا خط به خط اجرا می کنین دستورات رو اما در حالتی که به صورت script اجرا می کنین، پایتون یک بار همه چیز رو پارس و بررسی می کنه بعد اجرا می کنه که این دو حالت خیلی باهم متفاوتن

2 Likes

ممنون از کمکتون آقای رحمانی
شما می گید پایتون برای اجرای یک script یک بار همه رو پارس میکنه بعدش بررسی میکنه بعدش اجرا میکنه. ولی چیزی که من تا الان می دونستم پایتون برای اجرای یک script خط به خط پارس و اجرا میکنه.

کد زیر را نگاه کنید در یک script file نوشته و اجرا شده است

x = 10
print(x)
print(x / 0)
print(X * 2)

توی خط سوم خطا داره ولی خط یک و دو اجرا میشن . یعنی خط به خط پارس و اجرا میشه
اگر اشتباه می کنم راهنماییم کنید خوشحال میشم

عرضم به حضورتون که نه اینطوری نیست که خط به خط باشه. همیشه اول به یه ساختار AST تبدیل می شه. برای مثال کدی که دادین رو توی یه فایل ذخیره کنین و این کدی که من می دم رو توی یه کد دیگه و ادرس فایل رو توش درست کنین و بعد اجرا:

import ast

with open('esme_file.py') as fp:
    code = fp.read()
    tree = ast.parse(code)
    print ast.dump(tree)

این سکریپت ساختار AST کد شما رو بهتون میده.
پایتون با اینکه کد شما رو پارس می کنه اما تا زمان اجرا به شما exception نمی ده اونم واسه اینه که شاید شما بخواین اون exception رو catch کنین

2 Likes

در کل نتیجه می گیرم پایتون برای اجرا اسکریپت همه کد پارس میکنه و اگه خطا هم داشته باشه exception نمی ده و توی اجرا خطا داشته باشه exception میده درسته ؟
و اینکه :‍
وقتی کد پایتون اسکریپتی اجرا میکنیم داده های یکسان در یک خانه حافظه قرار می گیرند درسته ؟

درسته.

نمی تونین مطمئن باشین. پایتون تا اونجایی که من می دونم این مورد رو گارانتی نمی کنه و نباید روش حساب باز کنین

2 Likes

تا جایی که من میدونم، فقط توی یه سری موارد خاص اینکارو میکنه. زمانی که بخواد مصرف بهینه‌ی ram داشته باشه.

>>> a = [1, 2, 3, 4, 5]
>>> b = a
>>> b[2] = 0
>>> a
[1, 2, 0, 4, 5]

(در اینجا اگه بخوایم واقعا کپی بگیریم باید از list.copy() استفاده کنیم:

b = a.copy()
1 Like