سوال در خصوص متغیرهای محلی و گلوبال

noip

کاربر تازه وارد
تازه وارد
سلام و عرض ادب دوستان.

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


کد:
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)
پ.ن:تازه وارد هستم.
 

parsitacademy

کاربر تازه وارد
تازه وارد
سلام
دلیلش اینه که دیتا تایپ لیست از نوع mutable هست
زمانی که شما میگی mylist=[10,20,30] در حقیقت نام mylist رو به آبجکت [10,20,30] اختصاص دادی و وقتی میگی newmylist = mylist نام newmylist رو هم به همون آبجکت قبلی اختصاص دادی و آبجکت جدید نساختی . خروجی این کد رو ببین:
def change(mylist):
newmylist = []
newmylist = mylist
newmylist.append([1,2,3,4])
print("value inside" , newmylist)
print("ID of newmylist : " , id(newmylist))
mylist=[10,20,30]
print("ID of newmylist : " , id(mylist))
change(mylist)
print("outsid",mylist)
print("ID of newmylist : " , id(mylist))

میبینی که آی دی ها یکی هست و mylist و newmylist هردو به یک آبجکت در حافظه bind شدن
برای رفع این مشکل باید اینطور بنویسی:
def change(mylist):
newmylist = []
newmylist.append(mylist)
newmylist.append([1,2,3,4])
print("value inside" , newmylist)
print("ID of newmylist : " , id(newmylist))
mylist=[10,20,30]
print("ID of newmylist : " , id(mylist))
change(mylist)
print("outsid",mylist)
print("ID of newmylist : " , id(mylist))
 

noip

کاربر تازه وارد
تازه وارد
بسیار ممنونم.
ببخشید من هیچ جایی درخصوص mutable ها در حین اموزش برنخوردم.ممکنه یک توضیحی در این خصوص بدید؟یا منبعی که واضح توضیح داده باشه؟
 
بالا