”by value“ یا ”by reference“ در پایتون
سه شنبه, ۱۵ بهمن ۱۳۹۸، ۰۲:۳۳ ق.ظ
در پایتون ارسال اشیای تغییرناپذیر (Immutable) به مانند انواع بولین، اعداد، رشته و تاپل به تابع، باعث بروز رفتاری مشابه با شیوه by value میشود ولی در مورد ارسال اشیای تغییرپذیر (Mutable) به مانند انواع لیست، دیکشنری و مجموعه اینگونه نخواهد بود.
برای جلوگیری از تغییر اشیای تغییرپذیر درون تابع، میتوان یک کپی از این نوع اشیا را ایجاد و سپس به صورت آرگومان به تابع ارسال کرد:
>>> def f(a): ... a[0] = 3 ... print(a) ... >>> b = [1, 2] >>> f(b[:]) # Pass a copy [3, 2] >>> b [1, 2]
در نمونه کد بالا، از آنجایی که تمام اعضای شی لیست متغیر b تماما از انواع تغییرناپذیر هستند، یک کپی سطحی (Shallow Copy) از شی کفایت میکند ولی در حالتی غیر از این میبایست یک کپی عمیق (Deep Copy) از شی ارسال گردد.
به مثال زیر توجه کنید:
۹۸/۱۱/۱۵