Az append miért írja felül a lista összes elemét és hogy tudnám orvosolni a problémát?
Sziasztok! Python-ban programozok és a 2010 májusi info érettségit csinálnám.
Most próbálom a beolvasott stringet 3 elemenként külön listákra bontani, ami egy nagy listába kerülne. Ezzel könnyen megtudnám oldani a feladatokat. Viszont, amikor appendelek a valahogy az összes elem felülíródik a 'sorok'-ban. Nem értem miért.
Itt a kód:
tmp = []
sor1 = []
sorok = []
cycle = 0
"""a = open('eladott.txt','rt')
content = a.read()
a.close()"""
with open('eladott.txt','r') as a: # splitelni kell stripelni
content = a.read()
values = content.split()
print('KÜLÖN VANNAK: ',values)
for x in values:
cycle = cycle+1
tmp.append(x)
print('ez a cycle: ',cycle)
print('ez a tmp: ',tmp)
if cycle == 3:
sor1.extend(tmp)
print('ez a sor1: ', sor1)
tmp.clear()
print('tmp törlés után: ',tmp)
continue
elif cycle % 3 == 0:
sorok.append(tmp)
print('ez a sorok: ', sorok)
tmp.clear()
print('tpm sok törlés után: ', tmp)
continue
else:
continue
print('sorok: ',sorok)
print('első sor: ', sor1)
sorok.append(tmp)
print('ez a sorok: ', sorok)
tmp.clear()
Itt appendeled a tmp-t, de aztan torlod is a tartalmat.
A kulcsszó itt a referenciákon van. Az a lényeg, hogy amikor az egyik változót beleteszed a másikba, akkor a referenciáját teszed bele, így, amikor megváltoztatod az értékét, akkor a "sorok" listában lévő referencia a megváltoztatott értékre fog mutatni.
Itt van bővebben: [link]
Az a lényeg, hogy ne a listát/lista referenciáját, hanem a lista másolatát kell beletenni:
sorok.append(tmp.copy())
2-es válaszoló jól mondja, kitörlöd utána a tartalmát, miután hozzá appendeled a listához. Akkor az a listaelem ugyanarra a memóriacímre fog mutatni, mint a tmp változód, így ha tmp-t kiüríted, akkor a listában is üres lesz. Annyi a dolgod, hogy ezt írod helyette:
sorok.append(tmp[:])
Ezzel egy másolatát rakod be a listába a tmp-nek, és ha utána törlöd a tmp-t akkor az nem fogja bántani a listába rakottat.
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!