راکت

مشکل تغییر کردن لیست

2 پاسخ

چرا در این کد لیست jangal درست مانند لیست jangalnext تغییر میکند؟

from colorama import *

jangal = [['g','f','f'],['f','f','f'],['f','f','f']]

def nextyear():
    global jangal
    jangalnext = jangal.copy()
    for row in jangal:
        for character in row:
            if character == 'f':
                jangalnext[jangal.index(row)][row.index(character)] = 's'
            if character == 'g':
                if jangal.index(row) == 0:
                    if row.index(character) == 0:
                        if row[row.index(character)+1] == 'f' or jangal[jangal.index(row)+1][row.index(character)] == 'f':
                            jangalnext[jangal.index(row)][row.index(character)] = 'f'

def printjangal(jangal):
    for row in jangal:
        for i in row:
            if i == 'f':
                print(Back.RED, 'f', end='')
            if i == 'g':
                print(Back.GREEN, 'g', end='')
            if i == 's':
                print(Back.WHITE, 's', end='')
        print(Style.RESET_ALL)
    print()

printjangal(jangal)
nextyear()
printjangal(jangal)
nextyear()
printjangal(jangal)
ثبت پرسش جدید

پاسخ‌ها

2
مهدی نظری
مهدی نظری
@mahdi.nazari

تخصص: توسعه دهنده Front End

سلام دوست من 🖐
امیدوارم حالت خوب و عالی باشی✨

مشکل در این کد اینه که در تابع nextyear() شما لیست jangal را کپی کردی و به آن لیست جدیدی به نام jangalnext اختصاص دادی ، اما تغییرات را در jangalnext اعمال کردی و نه در jangal. این به این معنیه که تغییراتی که در jangalnext اعمال میکنی ، تأثیری در jangal نداره.

برای حل این مشکل و اعمال تغییرات در jangal باید به جای استفاده از jangalnext, تغییرات را مستقیماً در jangal انجام بدی. به عبارت دیگر، از متغیر jangal بجای jangalnext در تابع nextyear() استفاده کنی.

اصلاح شده‌ی کد:

from colorama import *

jangal = [['g','f','f'],['f','f','f'],['f','f','f']]

def nextyear():
    global jangal
    for row in jangal:
        for idx, character in enumerate(row):
            if character == 'f':
                row[idx] = 's'
            if character == 'g':
                if jangal.index(row) == 0:
                    if idx == 0:
                        if row[idx + 1] == 'f' or jangal[jangal.index(row) + 1][idx] == 'f':
                            row[idx] = 'f'

def printjangal(jangal):
    for row in jangal:
        for i in row:
            if i == 'f':
                print(Back.RED, 'f', end='')
            if i == 'g':
                print(Back.GREEN, 'g', end='')
            if i == 's':
                print(Back.WHITE, 's', end='')
        print(Style.RESET_ALL)
    print()

printjangal(jangal)
nextyear()
printjangal(jangal)
nextyear()
printjangal(jangal)

این تغییرات باعث می‌شود تغییرات در jangal اعمال بشن و شما تفاوت‌ها را در هر دور از تابع nextyear() مشاهده میکنی .

امیدوارم پاسخم بهت کمک کرده باشه ❤️
موفق و پیروز باشی 🤘🌹

وب دیزاینر
وب دیزاینر
@it1press

سلام
چون هر دو آرایه به یک آدرس اشاره میکنن.

شاید پاسخ شما همین‌جا باشد

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام