1. Transmiterea prin valoare
def dubleaza(x): x = x * 2 print(f" In functie, x = {x}") valoare = 5 print(f"Inainte de apel: valoare = {valoare}") dubleaza(valoare) print(f"Dupa apel: valoare = {valoare}")
Inainte de apel: valoare = 5 In functie, x = 10 Dupa apel: valoare = 5
dubleaza(valoare) leaga parametrul x la obiectul 5. Instructiunea x = x * 2 creeaza un nou obiect 10 si leaga x de el. valoare inca pointeaza spre 5. Complexitate copiere: O(1) pentru tipuri primitive.2. Obiecte mutabile — efect de referinta implicit
Tehnic Python transmite referinta prin valoare. Daca faci lst = [altceva] in functie (reasignare), originalul NU se schimba. Doar metodele care modifica obiectul in-place au efect exterior.
def adauga_element(lst, val): lst.append(val) # modifica obiectul in-place print(f" In functie, lst = {lst}") numere = [1, 2, 3] print(f"Inainte de apel: numere = {numere}") adauga_element(numere, 99) print(f"Dupa apel: numere = {numere}")
Inainte de apel: numere = [1, 2, 3] In functie, lst = [1, 2, 3, 99] Dupa apel: numere = [1, 2, 3, 99]
- int, float, str, tuple → imutabile → functia nu poate modifica originalul prin reasignare
- list, dict, set → mutabile → metodele in-place modifica originalul
3. Variabile locale si globale
- Variabila locala: definita in interiorul unei functii; vizibila si activa doar pe durata executiei acelei functii. La finalul functiei, este distrusa.
- Variabila globala: definita in afara oricarei functii; vizibila din toata aplicatia. In Python, ca sa o modifici dintr-o functie, trebuie sa declari
global numeVariabila.
contor_global = 0 # variabila globala def incrementeaza(): global contor_global # fara aceasta linie: UnboundLocalError contor_global += 1 variabila_locala = 42 # exista doar in aceasta functie print(f" contor_global={contor_global}, variabila_locala={variabila_locala}") print(f"Inainte: contor_global = {contor_global}") incrementeaza() incrementeaza() print(f"Dupa 2 apeluri: contor_global = {contor_global}") try: print(variabila_locala) except NameError: print("variabila_locala nu exista in afara functiei")
Inainte: contor_global = 0 contor_global=1, variabila_locala=42 contor_global=2, variabila_locala=42 Dupa 2 apeluri: contor_global = 2 variabila_locala nu exista in afara functiei
Variabilele globale fac codul greu de depanat. Solutia corecta: transmite date prin parametri si returneaza rezultate. Acceptabil doar pentru constante (MAX = 1000).
4. Capcana swap-ului — solutii corecte in Python
def swap_gresit(a, b): temp = a a = b b = temp print(f" In functie: a={a}, b={b}") x, y = 10, 20 print(f"Inainte: x={x}, y={y}") swap_gresit(x, y) print(f"Dupa swap_gresit: x={x}, y={y} <-- nu s-a schimbat!") # Swap corect: returnare multipla def swap_corect(a, b): return b, a x, y = swap_corect(x, y) print(f"Dupa swap_corect: x={x}, y={y} <-- corect!")
Inainte: x=10, y=20 In functie: a=20, b=10 Dupa swap_gresit: x=10, y=20 <-- nu s-a schimbat! Dupa swap_corect: x=20, y=10 <-- corect!
x, y = y, x # Python evalueaza dreapta integral, APOI asigneazaPython creeaza un tuplu temporar (y, x) si il dezimpacheteaza. Curat, O(1), fara variabila temporara explicita.5. C++: prin valoare vs prin referinta EXCLUSIV INTENSIV
In C++ ai control explicit: int x = prin valoare (copie), int& x = prin referinta (alias al originalului). Referinta e mai eficienta pentru obiecte mari si necesara cand vrei sa modifici originalul.
#include <iostream>
using namespace std;
// Prin valoare: primeste COPIA lui x
void dubleaza_val(int x) {
x = x * 2;
cout << " In functie (val): x = " << x << endl;
}
// Prin referinta: x este alias al argumentului original
void dubleaza_ref(int& x) {
x = x * 2;
cout << " In functie (ref): x = " << x << endl;
}
int main() {
int a = 5;
cout << "Inainte (val): a = " << a << endl;
dubleaza_val(a);
cout << "Dupa (val): a = " << a << " (nemodificat)" << endl;
int b = 5;
cout << "Inainte (ref): b = " << b << endl;
dubleaza_ref(b);
cout << "Dupa (ref): b = " << b << " (modificat!)" << endl;
return 0;
}Inainte (val): a = 5 In functie (val): x = 10 Dupa (val): a = 5 (nemodificat) Inainte (ref): b = 5 In functie (ref): x = 10 Dupa (ref): b = 10 (modificat!)
void f(int x)→ copie: O(1)void f(vector<int> v)→ copie: O(n) (copiaza tot vectorul)void f(const vector<int>& v)→ referinta const: O(1) (transmite doar adresa)
const T& = pattern standard C++ pentru argumente read-only de tip complex.6. C++: globale, locale si swap prin referinta EXCLUSIV INTENSIV
Swap-ul prin referinta este exemplul clasic al necesitatii parametrilor prin referinta in C++. Fara referinte, swap-ul nu functioneaza pe variabile int.
#include <iostream>
using namespace std;
int global_contor = 0; // variabila globala
void incrementeaza() {
global_contor++;
int local_val = 42; // locala: distrusa la iesire
cout << " global_contor=" << global_contor
<< ", local_val=" << local_val << endl;
}
void swap_ref(int& a, int& b) {
int temp = a; a = b; b = temp;
}
int main() {
cout << "=== Globale vs Locale ===" << endl;
cout << "Inainte: global_contor = " << global_contor << endl;
incrementeaza(); incrementeaza();
cout << "Dupa 2 apeluri: global_contor = " << global_contor << endl;
cout << endl << "=== Swap prin referinta ===" << endl;
int x = 10, y = 20;
cout << "Inainte: x=" << x << ", y=" << y << endl;
swap_ref(x, y);
cout << "Dupa: x=" << x << ", y=" << y << " (modificat!)" << endl;
return 0;
}=== Globale vs Locale === Inainte: global_contor = 0 global_contor=1, local_val=42 global_contor=2, local_val=42 Dupa 2 apeluri: global_contor = 2 === Swap prin referinta === Inainte: x=10, y=20 Dupa: x=20, y=10 (modificat!)
| Aspect | Python | C++ (intensiv) |
|---|---|---|
| Int prin valoare | implicit (imutabil) | void f(int x) |
| Modificare variabila | returnare + reasignare | void f(int& x) |
| Variabila globala | global x obligatoriu | acces direct (nivel fisier) |
| Swap corect | a, b = b, a sau return | swap_ref(int&, int&) |
| Obiect mare read-only | imutabil sau copie | const T& O(1) |