| کانال توسعه‌دهندگان پایتون |
6.59K subscribers
38 photos
2 videos
4 files
43 links
⭕️ کانال توسعه‌دهندگان پایتون دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
📌 Pass By Reference & Value

🔻 ارجاع بر اساس مقدار (pass by value) و ارجاع بر اساس مرجع (pass by reference) دو مفهومی است که معمولا در مباحث تابع مطرح می شود. اما معمولا در دوره های پایتون درباره‌ی این دو مفهموم صحبت نمیشه ولی بهتره که با این دو مفهموم آشنا باشیم.

🔺 قبل از اینکه شروع کنیم باید پیش زمینه‌ای از چگونگی قرار گیری متغیر در حافظه رم داشته باشیم.

🔺 در زبان پایتون زمانی که یک متغیر تعریف می‌کنیم یک آدرس در حافظه‌ی رم به متغیر اختصاص داده می‌شود و مقدار متغیر در آن آدرس قرار می گیرد که شما می توانید با استفاده از تابع id آدرس متغیر رو پیدا کنید. برای مثال :

Var = 20
print(id(Var)) # Output : 94587526803432

🔸 نکته‌ ای که وجود دارد این است که آدرس متغیر در حافظه رم ثابت نیست و با هر بار اجرای برنامه، مقدار عوض می شود.

🔺 در زبان های سطح پایین مثل C شما می توانید با استفاده از آدرس متغیر مقدار آن را در حافظه تغییر بدید ولی در زبان های سطح بالا مثل پایتون امکان تغییر مقدار متغیر با استفاده از آدرس آن در حافظه رم وجود نداره.
برای مثال : در زبان C++ می توانید با تعریف یک پوینتر (pointer) مقدار آدرس را عوض کنید.

int age = 10; 
int *address = &age;
*address = 15;
cout << age; // برای چاپ مقدار


🔸 در خط اول یک متغیر از نوع اعداد صحیح ایجاد کردیم و مقدار رو برابر با 10 قرار دادیم؛ بعد یک متغیر پوینتر (برای ذخیره آدرس متغییر) ایجاد کردم سپس آدرس (علامت & مانند تابع id عمل می کنه) متغییر age را در address ذخیره کردم و در لاین بعد مقدار متغیر را به طور غیر‌مستقیم تغییر دادم یعنی به جای نوشتن :
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']

def change(li:list):
li[0] = "None"

change(li)
print(li) # ['None', 'php', 'java']

🔸 از اونجایی که پایتون به صورت pass by reference عمل می‌کند، آدرس لیست به سمت تابع ارسال می‌شود که هر تغییر صورت بگیرد روی متغیر global صورت می‌گیرد.
به این مثال توجه کنید :
age = 10

def change(num):
age = 50

change(age)
print(age) # 10

🔸 در این تیک کد مقدار age داخل تابع تغییر کرده ولی زمانی که مقدار متغیر را پرینت می‌گیریم هیچ تغییری صورت نگرفته 🤔 اما چرا ؟
قبل از پاسخ دادن به این سوال باید یک چیز را بررسی کنیم در مثال اولی که برای حالت دوم مطرح کردیم یک لیست به سمت تابع ارسال می شود که لیست یک دیتاتایپ mutable (تغییر پذیر) و در مثال دوم اعداد صحیح یک دیتا تایپ immutable (تغییر ناپذیر) است.

🔹 پس در پاسخ به این سوال می‌توان گفت مقداری که به سمت توابع ارسال می‌شود، در صورتی که mutable باشد تغییرات روی متغییر ارسالی اعمال می شود و در غیراینصورت تغییر روی متغییر صورت نمی‌گیرد.

#pass_by_reference #pass_by_value

👤 black@root

💎 Channel: @DevelopixPython
👍3