Următorul rezultat este destul de surprinzător:
diva = "Ariana Grande"
diva.upper()
print("I just love {}!".format(diva))
▌I just love Ariana Grande!
Stai…nu a funcționat partea „diva.upper()”? A fost omisă? Am greșit cumva?
Și mai confuz este faptul că introducerea apelului „.upper()” direct în instrucțiunea print pare să funcționeze…dar doar temporar. Accesarea comenzii diva un moment mai târziu pare să o readucă la vechea sa valoare:
diva = "Ariana Grande"
print("I just love {}!".format(diva.upper()))
print("When does the next {} album come out?".format(diva))
▌I just love ARIANA GRANDE! ▌When does the next Ariana Grande album come out?
Cauza principală a acesteia și practic a tuturor tipăririlor derutante în Python poate fi descoperită consultând imaginea memoriei. Iată cum începe atunci când definim pentru prima dată diva:
| Nume de variabile și date atomice | Date agregate | |
| diva | ”Ariana Grande” |
Acum să presupunem că facem asta:
new_var_name = diva.upper()
Rezultatul este această imagine:
| Nume de variabile și date atomice | Date agregate | |
| diva | ”Ariana Grande” | |
| new_var_name | ”ARIANA GRANDE” |
Și acum vedem motivul pentru toate acestea. Conținutul variabilei diva în sine este neschimbat de apelul metodei. Apelul „.upper()” pe diva nu a modificat valoarea șirului în diva: a returnat doar o copie modificată a șirului.
Gândește-te așa: dacă te-aș întreba „cum te numești în Pig Latin?” și mi-ai spune, asta nu ți-ar schimba intrinsec numele real în Pig Latin. Pur și simplu mi-ai „returna” versiunea Pig Latin ca răspuns la interogarea mea.
Ai putea argumenta că acest comportament al lui Python este stupid sau, în cel mai bun caz, înșelător, iar eu sunt de fapt înclinat să fiu de acord cu tine în acest caz. Dar, desigur, cei care cer nu pot fi selectivi: cineva și-a făcut timp să scrie metoda .upper() pentru noi, așa că, dacă vrem să profităm de ea, trebuie să folosim manualul său de utilizare. Și adevărul este că multe (poate chiar majoritatea) funcțiilor/metodelor Python – inclusiv multe dintre cele de la Pandas, pe care le vom folosi pe scară largă – sunt codificate în acest stil: nu modifică efectiv variabilele care le sunt transmise, ci returnează o copie modificată pe care trebuie să o stochezi.
Acum, având în vedere că acesta este cazul, ar fi cel puțin frumos dacă ți-aș putea spune că a funcționat întotdeauna, în mod constant, așa. Atunci ai putea pur și simplu să accepți și să te obișnuiești cu el. Din păcate, nu. Există funcții/metode (multe) care modifică un parametru sau variabila la care au fost apelate. Așadar, uneori, abordarea noastră naivă de a apela metoda și de a aștepta ca variabila să se schimbe este exact ceea ce trebuie să facem. Concluzia este: nu există nicio modalitate de a ști fără să ți se spună sau fără să citești documentația. Vom învăța cum să facem ultima variantă într-un capitol viitor. Deocamdată, vă spun pur și simplu, spre evidență, că metodele din Figura 5.2 sunt toate de tipul „returnează o copie modificată” și vă anunț că ambele stiluri de metode există din abundență.
Încă câteva lucruri. În primul rând, ca un corolar al celor de mai sus, realizați că următoarea instrucțiune (pe o linie separată) este oficial 100% inutilă:
name_of_pet.lstrip()
Ați apelat metoda .lstrip() și apoi… nu ați făcut nimic cu valoarea returnată. Dacă nu o stocați într-o variabilă – sau dacă faceți ceva cu ea imediat, cum ar fi să o afișați înainte să vă alunece dintre degete – este pierdută irevocabil: nici măcar nu apare în imaginea de memorie, deoarece nu există un nume de variabilă. (Gândiți-vă la asta.)
În al doilea rând, observați următorul model, care este foarte des utilizat:
name_of_pet = name_of_pet.lstrip()
Aici, apelăm .lstrip() asupra variabilei name_of_pet și apoi stocăm valoarea returnată înapoi în variabila name_of_pet. S-ar putea să fie ceea ce ați crezut că s-ar fi întâmplat în primul rând – autorul liniei anterioare, inutile, probabil dorea ca spațiile inițiale ale variabilei în sine să fie eliminate permanent. Simplul apel al funcției .lstrip() asupra variabilei nu va face acest lucru, dar punerea valorii revizuite înapoi în aceeași casetă albastră din diagrama de memorie va face acest lucru.
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