📌 Pass By Reference & Value
🔻 ارجاع بر اساس مقدار (pass by value) و ارجاع بر اساس مرجع (pass by reference) دو مفهومی است که معمولا در مباحث تابع مطرح می شود. اما معمولا در دوره های پایتون دربارهی این دو مفهموم صحبت نمیشه ولی بهتره که با این دو مفهموم آشنا باشیم.
🔺 قبل از اینکه شروع کنیم باید پیش زمینهای از چگونگی قرار گیری متغیر در حافظه رم داشته باشیم.
🔺 در زبان پایتون زمانی که یک متغیر تعریف میکنیم یک آدرس در حافظهی رم به متغیر اختصاص داده میشود و مقدار متغیر در آن آدرس قرار می گیرد که شما می توانید با استفاده از تابع id آدرس متغیر رو پیدا کنید. برای مثال :
🔺 در زبان های سطح پایین مثل C شما می توانید با استفاده از آدرس متغیر مقدار آن را در حافظه تغییر بدید ولی در زبان های سطح بالا مثل پایتون امکان تغییر مقدار متغیر با استفاده از آدرس آن در حافظه رم وجود نداره.
برای مثال : در زبان C++ می توانید با تعریف یک پوینتر (pointer) مقدار آدرس را عوض کنید.
🔻 با گفتن موارد بالا وقتشه بریم سراغ مطلب اصلی. در زبان های سطح پایین به دو صورت میتوانید به تابع مقدار ارسال کنید:
1️⃣ مقدار متغیر را ارسال کنید (pass by value).
2️⃣ آدرس متغیر را ارسال کنید (pass by reference).
🔸 در حالت اول شما کپی از متغیر را ارسال می کنید، در واقع یک متغیر در حافطه رم ایجاد می شود. از اونجایی که پایتون از این روش برای ارسال متغیر به سمت تابع استفاده نمیکنه مجبوریم مثال از C++ بزنیم تا این موضوع رو درک کنید.
🔸 در حالت دوم شما آدرس متغیر را ارسال می کنید که تغییرات اعمال شده مستقیما روی متغیر اصلی صورت میگیرد.
🔻 روشی که پایتون برای ارسال مقدار به سمت تابع استفاده میکند به صورت pass by reference است.
برای مثال :
به این مثال توجه کنید :
قبل از پاسخ دادن به این سوال باید یک چیز را بررسی کنیم در مثال اولی که برای حالت دوم مطرح کردیم یک لیست به سمت تابع ارسال می شود که لیست یک دیتاتایپ mutable (تغییر پذیر) و در مثال دوم اعداد صحیح یک دیتا تایپ immutable (تغییر ناپذیر) است.
🔹 پس در پاسخ به این سوال میتوان گفت مقداری که به سمت توابع ارسال میشود، در صورتی که mutable باشد تغییرات روی متغییر ارسالی اعمال می شود و در غیراینصورت تغییر روی متغییر صورت نمیگیرد.
#pass_by_reference #pass_by_value
👤 black@root
💎 Channel: @DevelopixPython
🔻 ارجاع بر اساس مقدار (pass by value) و ارجاع بر اساس مرجع (pass by reference) دو مفهومی است که معمولا در مباحث تابع مطرح می شود. اما معمولا در دوره های پایتون دربارهی این دو مفهموم صحبت نمیشه ولی بهتره که با این دو مفهموم آشنا باشیم.
🔺 قبل از اینکه شروع کنیم باید پیش زمینهای از چگونگی قرار گیری متغیر در حافظه رم داشته باشیم.
🔺 در زبان پایتون زمانی که یک متغیر تعریف میکنیم یک آدرس در حافظهی رم به متغیر اختصاص داده میشود و مقدار متغیر در آن آدرس قرار می گیرد که شما می توانید با استفاده از تابع id آدرس متغیر رو پیدا کنید. برای مثال :
Var = 20🔸 نکته ای که وجود دارد این است که آدرس متغیر در حافظه رم ثابت نیست و با هر بار اجرای برنامه، مقدار عوض می شود.
print(id(Var)) # Output : 94587526803432
🔺 در زبان های سطح پایین مثل C شما می توانید با استفاده از آدرس متغیر مقدار آن را در حافظه تغییر بدید ولی در زبان های سطح بالا مثل پایتون امکان تغییر مقدار متغیر با استفاده از آدرس آن در حافظه رم وجود نداره.
برای مثال : در زبان C++ می توانید با تعریف یک پوینتر (pointer) مقدار آدرس را عوض کنید.
int age = 10;🔸 در خط اول یک متغیر از نوع اعداد صحیح ایجاد کردیم و مقدار رو برابر با 10 قرار دادیم؛ بعد یک متغیر پوینتر (برای ذخیره آدرس متغییر) ایجاد کردم سپس آدرس (علامت & مانند تابع id عمل می کنه) متغییر age را در address ذخیره کردم و در لاین بعد مقدار متغیر را به طور غیرمستقیم تغییر دادم یعنی به جای نوشتن :
int *address = &age;
*address = 15;
cout << age; // برای چاپ مقدار
age = 15به طور غیر مستقیم با استفاده از آدرس متغیر در حافظ رم مقدار متغیر را تغییر دادم.
🔻 با گفتن موارد بالا وقتشه بریم سراغ مطلب اصلی. در زبان های سطح پایین به دو صورت میتوانید به تابع مقدار ارسال کنید:
1️⃣ مقدار متغیر را ارسال کنید (pass by value).
2️⃣ آدرس متغیر را ارسال کنید (pass by reference).
🔸 در حالت اول شما کپی از متغیر را ارسال می کنید، در واقع یک متغیر در حافطه رم ایجاد می شود. از اونجایی که پایتون از این روش برای ارسال متغیر به سمت تابع استفاده نمیکنه مجبوریم مثال از C++ بزنیم تا این موضوع رو درک کنید.
int age = 10;در این تیک کد آدرس دو متغیر نسبت به هم متفاوت است. آدرس متغیری که در خارج از تابع قرار دارد با مقدار ارسال شده به سمت تابع متفاوت است چون یک کپی از متغیر ارسال شده. انگار که یک متغیر جدید با همون مقدار تعریف کردیم.
cout << &age; // output 94587526803432
int hello(age){
cout<<&age; // output 94503976803514
}
hello(age);
🔸 در حالت دوم شما آدرس متغیر را ارسال می کنید که تغییرات اعمال شده مستقیما روی متغیر اصلی صورت میگیرد.
🔻 روشی که پایتون برای ارسال مقدار به سمت تابع استفاده میکند به صورت pass by reference است.
برای مثال :
li = ['python', 'php', 'java']🔸 از اونجایی که پایتون به صورت pass by reference عمل میکند، آدرس لیست به سمت تابع ارسال میشود که هر تغییر صورت بگیرد روی متغیر global صورت میگیرد.
def change(li:list):
li[0] = "None"
change(li)
print(li) # ['None', 'php', 'java']
به این مثال توجه کنید :
age = 10🔸 در این تیک کد مقدار age داخل تابع تغییر کرده ولی زمانی که مقدار متغیر را پرینت میگیریم هیچ تغییری صورت نگرفته 🤔 اما چرا ؟
def change(num):
age = 50
change(age)
print(age) # 10
قبل از پاسخ دادن به این سوال باید یک چیز را بررسی کنیم در مثال اولی که برای حالت دوم مطرح کردیم یک لیست به سمت تابع ارسال می شود که لیست یک دیتاتایپ mutable (تغییر پذیر) و در مثال دوم اعداد صحیح یک دیتا تایپ immutable (تغییر ناپذیر) است.
🔹 پس در پاسخ به این سوال میتوان گفت مقداری که به سمت توابع ارسال میشود، در صورتی که mutable باشد تغییرات روی متغییر ارسالی اعمال می شود و در غیراینصورت تغییر روی متغییر صورت نمیگیرد.
#pass_by_reference #pass_by_value
👤 black@root
💎 Channel: @DevelopixPython
👍3