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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: متغیر و لیست در پایتون‌(حل شده)  (دفعات بازدید: 1102 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین bloodyvampire

  • Newbie
  • *
  • ارسال: 3
متغیر و لیست در پایتون‌(حل شده)
« : 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]]دلیلش چیه ؟
« آخرین ویرایش: 26 بهمن 1396، 12:45 ب‌ظ توسط bloodyvampire »

آفلاین sajed68

  • Jr. Member
  • *
  • ارسال: 52
  • جنسیت : پسر
پاسخ : متغیر و لیست در پایتون
« پاسخ #1 : 26 بهمن 1396، 10:20 ق‌ظ »
سلام
این مثال رو ببین:
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.

آفلاین Emptyc

  • Full Member
  • *
  • ارسال: 215
  • جنسیت : پسر
پاسخ : متغیر و لیست در پایتون
« پاسخ #2 : 26 بهمن 1396، 10:50 ق‌ظ »
بزار خط به خط بریم جلو
شما آبجکت از نوع لیست ساختید به نام 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 دارن به یک جایی از خانه حافظه اشاره میکنن.

این لینک میتونه بهت خیلی کمک کنه
« آخرین ویرایش: 26 بهمن 1396، 10:53 ق‌ظ توسط Emptyc »
بُزُرْگي سَرآسَر بِهْ گُفتآرْ نيست ./. دُوصَد گُفْتِه چُو نیمْ کِرْدآرْ نیستْ.

آفلاین bloodyvampire

  • Newbie
  • *
  • ارسال: 3
پاسخ : متغیر و لیست در پایتون
« پاسخ #3 : 26 بهمن 1396، 12:44 ب‌ظ »
ممنون از دوستان