Python: mi a különbség a két list között?
Egy kicsit másképp felírva:
x = ['.', '.', '.']
a = x*3
vagyis a=[x,x,x]
namost 'a' bármelyik elemét változtatod meg tulajdonképpen x-et változtatod. És mivel a = [x,x,x] ezért mindenhol módosul.
Az a[1][1] helyett változtathatod az a[0][1]-et vagy az a[2][1]-et is, ugyanaz lesz az eredmény.
A b tömbnél minden elemet egyedileg határoztál meg ezért a b[1][1] nem ugyanoda mutat mint pl a b[0][1]
Első lista: egyetlen objektumot hoz létre, és három hivatkozást a megfelelő memóriacímre. Mind a három elem ugyanarra a memóriacímre mutat, ezt az id() függvénnyel ellenőrizheted. id(a[0]) == id(a[1]) == id(a[2]). Amikor pythonban egy listát úgy sokszorosítasz, hogy megszorzod egy számmal, mindig ez történik. Bármelyik listát módosítod, az a többi példánnyal is megtörténik.
Ezzel szemben a másik listában három különböző listát hozol létre. Az elemeik azonosak, de a memóriacímük nem. Ezért ha az egyiket megváltoztatod, az nem érinti a többit. Az első listában tapasztalt anomáliát így tudod kikerülni:
a = [["."]*3 for i in range(3)]
Ez a b-nek megfelelő listát adja eredményül.
Továbbá van egy copy nevű modul, amiben a copy és deepcopy szintén segíthet, ha úgy akarod az egyik listát módosítani, hogy a többi ne változzon:
>>> a = [["."]*3]*3
>>> a_1 = copy(a[1][1]) #kimented változóba a lista másolatát
>>> a_1[1] = "X" # ezt módosítod
>>> print a_1
['.', 'X', '.']
>>> print(a) # Az eredeti lista változatlan.
[['.', '.', '.'], ['.', '.', '.'], ['.', '.', '.']]
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!