Questa non è una distinzione Python vs Other Languages - in realtà è una distinzione Tipi di valore vs tipi di riferimento . Python usa i tipi di riferimento, e mentre molti linguaggi moderni tendono ad usare i tipi di riferimento, è comune confrontare Python (o qualsiasi lingua, in realtà) con C / C ++, che usano tipi di valore.
(Sto semplificando molto le cose qui - ci sono linguaggi che supportano sia i tipi di riferimento sia quelli di valore, i linguaggi che usano i tipi di valore hanno solitamente dei puntatori, che sono la versione di tipo valore dei tipi di riferimento e alcune lingue che usano il riferimento i tipi usano i tipi di valore per le primitive)
Con tipi di riferimento - come quello che usa Python - la variabile si riferisce alla "scatola" nella memoria. Ciò significa che più variabili possono fare riferimento alla stessa casella:
class Foo:
x = 1
foo = Foo()
bar = foo
bar.x = 10
print(foo.x) # prints 10
Quando abbiamo cambiato bar.x
, anche foo.x
è stato modificato. Questo perché foo
e bar
sono entrambi etichette nella stessa casella.
Confronta con questo codice C:
#include<stdio.h>
struct Foo {
int x;
};
int main(int ARGC, char** ARGV) {
struct Foo foo, bar;
foo.x = 0;
bar = foo;
bar.x = 10;
printf("%d\n", foo.x); // prints 0
return 0;
}
C usa i tipi di valore, quindi foo
e bar
non sono "etichette" - sono le stesse scatole. Ecco perché quando cambiamo bar.x
, foo.x
non cambia - sono scatole diverse e bar = foo
non fa bar
si riferisce alla stessa scatola di foo
come ha fatto in Python - invece, copia il contenuto della casella foo
nella casella bar
.