انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: bloodyvampire در 26 بهمن 1396، 08:25 قظ
-
درود
توی این قطعه کد
main_list = []
tmp_list = []
for number in range(5):
tmp_list.append(number)
main_list.append(tmp_list)
print(main_list)
انتظار میره که خروجی این باشه
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4]]
ولی این خروجیه
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
دلیلش چیه ؟
-
سلام
این مثال رو ببین:
a = [1,2,3]
b = [a]
print(a)
print(b)
a.append(5)
print(a)
print(b)
میگه وقتی b یک لیست هست که a در اون قرار داره (نه محتویاتش، بلکه خود a)، حالا اگر a تغییر کنه خب b هم تغییر میکنه. حالا مثال زیر رو ببین:
a = [1,2,3]
b = [a[::]]
print(a)
print(b)
a.append(5)
print(a)
print(b)
که خب اینجا محتوایاتش رو ریختم داخل لیست b.
-
بزار خط به خط بریم جلو
شما آبجکت از نوع لیست ساختید به نام main_list ساختی بعد اون یک آبجکت دیگه به نام tmp_list ساختی حلا بزار بریم توی حلقه
توی حلقه قراره به تعداد پنج بار یه کارو تکرار میکنیم مقدار متغیر number رو بریزیم توی خانه حافظهای که شی ([0]tmp_list) بهش اشاره میکنه. دقت کن tmp_list یک شی است نه یک متغیر ساده، درواقع tmp_list متغیری هستش که فقط آدرس خانههای حافظه رو توی خودش نگهداری میکنه نه مقدار خانه حافظه رو و درواقع داره نقش یه اشارهگر رو ایفا میکنه. بعد از اینکه مقدار درون number توی حافظه ای که ([0]tmp_list) قرار گرفت میره خط بعد.
توی خط بعد اتفاقات یه جور دیگهاست; توی این خط فکر کن ([0]main_list) داره به آدرس 1243 توی خانهحافظه اشاره میکنه که مقداری توش نیست یا None هست! و (tmp_list[0]) داره به خونه 1523 اشاره میکنه که مقدار 0 توی اونه خونهاس. حالا دستور main_list.append(tmp_list) اجرا میشه، برخلاف دستور قبل که مقدار number توی خانه حافظه نشست اینجا آدرسی که (main_list[0]) به اون داره اشاره میکنه تغییر میکنه! اگه اون آدرس 1243 بوده حالا شده 1523 که توی اون خونه 0 هست! حلا اگه مقدار درون خانه 1523 تغییر کنه قاعدتا main_list هم داره به اون اشاره میکنه و تغییرات رو نشون میده و نکته این کد همینجاست
زمانی که حلقه تکرار میشه مقادیری که tmp_list داره به اونا اشاره میکنه تغییر میکنن و چون ما آدرسهایی که درون tmp_list هستن رو به main_list میدیم پس هر تغییری که خانههای tmp_list بکنن به همون شکل توی main_list تغییر میکنن چون main_list و tmp_list دارن به یک جایی از خانه حافظه اشاره میکنن.
این لینک (https://stackoverflow.com/questions/13299427/python-functions-call-by-reference) میتونه بهت خیلی کمک کنه
-
ممنون از دوستان