Acum, o surpriză pentru cei neatenți. Să presupunem că scriu acest cod:
stooges = np.array(['Larry','Beavis','Moe'])
funny_people = stooges
stooges[1] = 'Curly'
print("The stooges are: {}.".format(stooges))
print("The funny people are: {}.".format(funny_people))
Gândiți un moment și preziceți care credeți că va fi rezultatul. Apoi, citiți-l și (eventual) plângeți:
▌ The stooges are: ['Larry' 'Curly' 'Moe']. ▌ The funny people are: ['Larry' 'Curly' 'Moe'].
Atenție: fără Beavis.
Acum întrebarea este de ce. Pentru a înțelege acest lucru (și practic orice altă problemă dificilă de programare) trebuie să reveniți încă o dată la imaginea memoriei. Figura 9.1 prezintă situația imediat înainte și după executarea liniei „stooges[1] = ‘Curly’”. Crucial este faptul că există o singură matrice în memorie. Ambele variabile – stooges și funny_people – indică spre ea
Figura 9.1: Codul anterior imediat înainte (partea stângă) și după (partea dreaptă) atingerea liniei „stooges[1] = ‘Curly’”.
Vedeți, dacă y conține date agregate (în loc de date atomice), linia „x = y” nu efectuează o operațiune de copiere. În schimb, indică doar numele variabilei x către același loc spre care indică y.
Odată ce înțelegi acest lucru, este ușor de înțeles de ce „Beavis” a dispărut complet. Există o singură matrice, așa că schimbarea numelui „stooges” are efectul secundar de a schimba implicit și numele „funny_people”.
Copierea efectivă
Comportamentul „îndrumă variabila către același lucru, dar nu face o copie” este implicit, deoarece astfel de operațiuni de copiere sunt costisitoare (în ceea ce privește utilizarea memoriei și timpul de execuție). În mod normal, nu sunt ceea ce dorești oricum. Uneori, însă, vrei să produci o copie completă și separată a unei matrice, astfel încât să poți modifica copia, păstrând în același timp originalul. Pentru a face acest lucru, utilizați metoda .copy():
orig_beatles = np.array(['John', 'Paul', 'George', 'Pete'])
beatles = orig_beatles.copy()
beatles[3] = 'Ringo'
print("The Beatles were originally {}.".format(orig_beatles))
print("But the ones we all know were {}.".format(beatles))
Priviți cu atenție a doua linie: face toată diferența. În loc să facem ca noua variabilă beatles să indice către aceeași matrice din memorie ca orig_beatles, am copiat explicit matricea și am făcut ca beatles să indice către acea nouă copie. Imaginea finală a memoriei este așadar ca în Figura 9.2, iar rezultatul este, desigur:
▌ The Beatles were originally ['John' 'Paul' 'George' 'Pete']. ▌ But the ones we all know were ['John' 'Paul' 'George' 'Ringo'].
Figura 9.2: Imaginea de memorie după apelarea metodei .copy(), în loc de simpla atribuire unei variabile noi.
Sursa: Stephen Davies, The Crystal Ball – Instruction Manual, Vol. 1: Introduction to Data Science, v. 1.1. Copyright © 2021 Stephen Davies. Licența CC BY-SA 4.0. Traducere și adaptare: Nicolae Sfetcu. © 2025 MultiMedia Publishing, Introducere în Știința Datelor, Volumul 1
Descoperă mai multe la MultiMedia
Abonează-te ca să primești ultimele articole prin email.





Lasă un răspuns