Programming
کد زیر رو تو هر نسخهای از پایتون ۳ که دوست دارید اجرا کنید (ترجیحا تو مفسر زنده) >>> class Test: ... def __del__(self): ... print("Deleted!") ... >>> t = Test() >>> z = t >>> z <__main__.Test object at 0x0000...> >>> del t >>> del z >>> "Test"…
جواب درست رو صاحاب کانال گفت ولی تیکه تیکه گفت من اینجا براتون خلاصه توضیح میدم:
وقتی z رو مقداردهی میکنیم، درواقع تبدیل میشه به رفرنسی از متغیر t
تو پایتون یه آبجکت پاک نمیشه تا وقتی که رفرنس هاش هم پاک بشن (این قضیه مربوط میشه به garbage collector)
وقتی همینجوری z رو داخل یه مفسر زنده وارد میکنیم، مقدار اون چیزی که وارد کردیم رو به متغیر "_" مقداردهی میکنه
همین باعث میشه که یه رفرنس دیگه ایجاد شه که با وارد کردن "Test" یا هر مقدار دیگهای تو مفسر، اون رفرنس پاک میشه و در نهایت متد
وقتی z رو مقداردهی میکنیم، درواقع تبدیل میشه به رفرنسی از متغیر t
تو پایتون یه آبجکت پاک نمیشه تا وقتی که رفرنس هاش هم پاک بشن (این قضیه مربوط میشه به garbage collector)
وقتی همینجوری z رو داخل یه مفسر زنده وارد میکنیم، مقدار اون چیزی که وارد کردیم رو به متغیر "_" مقداردهی میکنه
همین باعث میشه که یه رفرنس دیگه ایجاد شه که با وارد کردن "Test" یا هر مقدار دیگهای تو مفسر، اون رفرنس پاک میشه و در نهایت متد
__del__ اجرا میشه
Programming
یکی بیاد این خراب شده رو زنده کنه من وقت نمیکنم
یه ساله داریم زنده میکنیمش
#چالش
سطح: آسون
پ.ن: اینو احتمالا بیشترتون میدونید دلیلشو و حتی هوش مصنوعی هم میتونه بگه ولی هرکی خلاصه تر بگه فورواردش میکنم کانال
سطح: آسون
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 257; b = 257
>>> a is b
True
پ.ن: اینو احتمالا بیشترتون میدونید دلیلشو و حتی هوش مصنوعی هم میتونه بگه ولی هرکی خلاصه تر بگه فورواردش میکنم کانال
Programming
#چالش سطح: آسون >>> a = 256 >>> b = 256 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False >>> a = 257; b = 257 >>> a is b True پ.ن: اینو احتمالا بیشترتون میدونید دلیلشو و حتی هوش مصنوعی هم میتونه بگه ولی هرکی خلاصه تر بگه فورواردش میکنم کانال
>>> a = "test"
>>> b = "test"
>>> a is b
True
>>> a = "test!"
>>> b = "test!"
>>> a is b
False
این هم همینطور
این پکیج ۲۴ سال پیش به پایتون اضافه شده. خیلی مبهمه. معلوم نیست شوخیه یا سوتیه.
عکس سمت راست کدیه که واسه پرینت شدن متن توی عکس سمت چپ نوشته شده
اسم پکیج: this
عکس سمت راست کدیه که واسه پرینت شدن متن توی عکس سمت چپ نوشته شده
اسم پکیج: this
😁2👨💻1
Programming
این پکیج ۲۴ سال پیش به پایتون اضافه شده. خیلی مبهمه. معلوم نیست شوخیه یا سوتیه. عکس سمت راست کدیه که واسه پرینت شدن متن توی عکس سمت چپ نوشته شده اسم پکیج: this
اسم الگوریتمی که واسه مبهم سازی استفاده کرده ROT13 هست، اگه کسی دوست داشت بدونه.
Programming
#چالش سطح: آسون >>> a = 256 >>> b = 256 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False >>> a = 257; b = 257 >>> a is b True پ.ن: اینو احتمالا بیشترتون میدونید دلیلشو و حتی هوش مصنوعی هم میتونه بگه ولی هرکی خلاصه تر بگه فورواردش میکنم کانال
وقتی مفسر پایتون اجرا میشه از اعداد -5 تا 256 توی حافظه دستگاه (RAM) ذخیره میشن
این یه جور راه حل پایتون برای افزایش سرعته. هروقت بخواید یه متغیر با مقدار عددی تو این بازه درست کنید، مفسر پایتون واقعا از صفر اون متغیر رو تو حافظه درست نمیکنه چون از قبل تو حافظه یدونه ساخته و فقط متغیر شما رو رفرنسی برای متغیر اصلی خودش میکنه
به همین خاطره که:
البته پیاده سازی این سیستم بهینه سازی بسته به ورژن پایتون، نوع سیستم عامل و چیزای دیگه ممکنه متفاوت بشه و به همین خاطر کدهای زیر ممکنه نتیجه متفاوتی روی پایتون سیستم شما بده:
این یه جور راه حل پایتون برای افزایش سرعته. هروقت بخواید یه متغیر با مقدار عددی تو این بازه درست کنید، مفسر پایتون واقعا از صفر اون متغیر رو تو حافظه درست نمیکنه چون از قبل تو حافظه یدونه ساخته و فقط متغیر شما رو رفرنسی برای متغیر اصلی خودش میکنه
به همین خاطره که:
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
البته پیاده سازی این سیستم بهینه سازی بسته به ورژن پایتون، نوع سیستم عامل و چیزای دیگه ممکنه متفاوت بشه و به همین خاطر کدهای زیر ممکنه نتیجه متفاوتی روی پایتون سیستم شما بده:
>>> a, b = 257, 257
>>> a is b # python 3.7
False
>>> a is b # پیاده سازی متفاوت
True
>>> a = 257; b = 257;
>>> a is b
True
🔥1👨💻1
Programming
>>> a = "test" >>> b = "test" >>> a is b True >>> a = "test!" >>> b = "test!" >>> a is b False این هم همینطور
برای رشته ها هم یه همچین سیستم بهینه سازی وجود داره منتها یکم فرق داره
همونطور که شاید بدونید رشته ها مثل لیستا تو رم ذخیره میشن
هر کاراکتر جدا ذخیره میشه و آخر سر یه رشته ساخته میشه که رفرنس همه این کاراکترا رو یه جا تو رم ذخیره کنه
حالا پایتون یه سیستم به اسم داوطلب سازی (Interning) داره که میاد کاراکترای "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz" رو از قبل تو حافظه ذخیره میکنه و هر رشته ای که بعدا تو برنامتون بسازید و فقط از این کاراکترا استفاده کنه، دونه دونه کاراکترای از قبل رزرو شده توی رشته شما داوطلب یا جایگزین میشن
شاید من اشتباه برداشت کردم یا توضیح دادم ولی اگه خواستید بیشتر بدونید کد پیاده سازیش تو این لینک هست:
https://github.com/python/cpython/blob/3.6/Objects/codeobject.c#L19
همونطور که شاید بدونید رشته ها مثل لیستا تو رم ذخیره میشن
هر کاراکتر جدا ذخیره میشه و آخر سر یه رشته ساخته میشه که رفرنس همه این کاراکترا رو یه جا تو رم ذخیره کنه
حالا پایتون یه سیستم به اسم داوطلب سازی (Interning) داره که میاد کاراکترای "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz" رو از قبل تو حافظه ذخیره میکنه و هر رشته ای که بعدا تو برنامتون بسازید و فقط از این کاراکترا استفاده کنه، دونه دونه کاراکترای از قبل رزرو شده توی رشته شما داوطلب یا جایگزین میشن
شاید من اشتباه برداشت کردم یا توضیح دادم ولی اگه خواستید بیشتر بدونید کد پیاده سازیش تو این لینک هست:
https://github.com/python/cpython/blob/3.6/Objects/codeobject.c#L19
اگه دقت کنید "test!" یه کاراکتر علامت تعجب داره که توی اون بازه نیست
واسه همینه که رفرنس نمیشه و تو یه جای مجزا تو رم ذخیره میشه
واسه همینه که رفرنس نمیشه و تو یه جای مجزا تو رم ذخیره میشه
👍2