En algunas aplicaciones sencillas que me ha tocado escribir en C/C++ he visto la facilidad con la que se resuelven ciertas tareas utilizando punteros. Ahora, más interesado en otro lenguaje: Python, he notado la ausencia de este concepto. ¿A qué se debe esta ausencia? Siendo Python un lenguaje muy poderoso y utilizado, entonces, ¿qué concepto lo sustituye?, ¿está implícito en los tipos de datos, en las asignaciones, en la instanciación de una clase?
Un ejemplo extremadamente sencillo sería que en C podemos codificar cosas como esta:
#include <stdio.h>
int main(void) {
// your code goes here
int a = 5;
int *b = &a;
printf("a = %d; b = %d\n", a, *b); // (1)
a = 6;
printf("a = %d; b = %d\n", a, *b); // (2)
return 0;
}
(1): a = 5; b = 5
(2): a = 6; b = 6
b
apunta a la dirección de memoria de a
, cualquier modificación en a
podrá ser observada al desreferenciar b
. Cualquier asignación por indirección *b = <valor>;
modificará a
.
Pero, en Python:
a = 5
b = a
print "a = {0:d}; b = {1:d}".format(a,b) # (1)
b is a # resultado: True
a = 6
print "a = {0:d}; b = {1:d}".format(a,b) # (2)
b is a # resultado: False
(1): a = 5; b = 5
(2): a = 6; b = 5
Al principio a
y b
hacen referencia al mismo objeto. Luego, cuando a
es modificado se crea un nuevo objeto; entonces, ambos hacen referencia a objetos diferentes y de valores diferentes.
No hay una forma de hacer lo que en C en Python con este tipo de dato, pero es posible hacer algo similar con tipos de datos mutables; sin embargo, solo se puede cuando hacemos modificaciones internas del dato mutable, por ejemplo: cambiar el valor de un elemento de una lista.
a = [1, 2]
b = a
print b is a # resultado: True
b.append(3)
print b is a # resultado: True
a = [4, 5]
print b is a # resultado: False