an80
1 سال پیش توسط an80 مطرح شد
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)

ثبت پرسش جدید
مهدی نظری
تخصص : توسعه دهنده Front End
@mahdi.nazari 1 سال پیش مطرح شد
0

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

مشکل در این کد اینه که در تابع 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 1 سال پیش مطرح شد
-1

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


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

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