انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: Mr-virus در 27 اردیبهشت 1399، 10:54 ب‌ظ

عنوان: سوال در خصوص یک قطعه کد پایتون
ارسال شده توسط: Mr-virus در 27 اردیبهشت 1399، 10:54 ب‌ظ
سلام و عرض ادب دوستان.

بنده یک سوالی برام پیش اومده.به قطعه کد زیر توجه کنید:



def change(mylist):
    mylist.append([1,2,3,4])
    print("value insid" , mylist)
mylist=[10,20,30]
change(mylist)
print("outsid",mylist)
در بالا من mylist رو به عنوان آرگومان به تابع دادم و همونطور که میبینید یک لیستی رو بهش اضافه کردم و بعد چاپش کردم.سوالم اینه که مگر من mylist رو به عنوان یک متغیر به تابع ندادم؟اگر بله مگر این متغیر درون تابع مگه نباید به صورت لوکال محسوب بشه و فقط مقدار mylist داخل تابع تغییر کنه؟اگر بله پس چرا در خروجی مقدار mylist گلوبال رو هم تغییر داده؟

ممنون میشم یک توضیحی بدید.


===============
یک مسئله دیگه ای وجود داره که بنده mylist رو میگیرم و مقدار mylist رو به یک متغیر دیگه میدم و به متغیر جدید هر مقداری اضافه می کنم مقدار mylist هم اضافه میشه !!

def change(mylist):
    newmylist = mylist
    newmylist.append([1,2,3,4])
    print("value inside" , newmylist)
mylist=[10,20,30]
change(mylist)
print("outsid",mylist)
عنوان: پاسخ : سوال در خصوص یک قطعه کد پایتون
ارسال شده توسط: M!lad در 27 اردیبهشت 1399، 11:25 ب‌ظ
list یک نوع داده mutable هست. شما تو تابع دارید دقیقا همون list خارجی رو تغییر می‌دید. یعنی یک فرنس به همون رو پاس دادید به تابع.

باید به این شکل تابع رو صدا کنید:

change(my_list[:])

که یک کپی ازش پاس داده بشه.

جواب سوال دوم هم همینه.



>>> lst = [1,2,3]
>>> lst2 = lst
>>> id(lst)
140138427623232
>>> id(lst2)
140138427623232
>>> lst.append(4)
>>> lst2
[1, 2, 3, 4]
>>> lst2 = ['a', 'b', 'c']
>>> lst
[1, 2, 3, 4]
>>> id(lst2)
140138427623168
>>> id(lst)
140138427623232
>>>

عنوان: پاسخ : سوال در خصوص یک قطعه کد پایتون
ارسال شده توسط: Mr-virus در 27 اردیبهشت 1399، 11:45 ب‌ظ
خیلی ممنون از شما.

ببخشید منبعی برای مطالعه و آشنایی با متغیرهای mutable (در صورت وجود منابع فارسی زبان) می تونید معرفی کنید؟

سرچ کردم مطالب قابل فهمی پیدا نکردم.