¿Por qué debería referirme a “nombres” y “enlace” en Python en lugar de “variables” y “asignación”?

¿Por qué debería referirme a “nombres” y “enlace” en Python en lugar de “variables” y “asignación”? Sé que esta pregunta es un poco general pero realmente me gustaría saber 🙂

En C y C ++, una variable es una ubicación de memoria nombrada. El valor de la variable es el valor almacenado en esa ubicación. Asigna a la variable y modificas ese valor. Así que la variable es la ubicación de la memoria, no el nombre para ella.

En Python, una variable es un nombre que se usa para referirse a un objeto. El valor de la variable es ese objeto. Hasta ahora suena como lo mismo. Pero asigne a la variable y no modificas el objeto en sí, sino que alteras a qué objeto se refiere la variable. Entonces la variable es el nombre, no el objeto.

Por esta razón, si está considerando las propiedades de Python en el resumen, o si está hablando de varios idiomas a la vez, es útil usar nombres diferentes para estas dos cosas diferentes. Para mantener las cosas en orden, puede evitar hablar de variables en Python y referirse a lo que hace el operador de asignación como “vinculante” en lugar de “asignación”.

Tenga en cuenta que la gramática de Python se refiere a las “asignaciones” como un tipo de statement, no a “enlaces”. Al menos parte de la documentación de Python llama nombres a las variables . Entonces, solo en el contexto de Python, no es incorrecto hacer lo mismo. Diferentes definiciones para palabras de jerga se aplican en diferentes contextos.

En, por ejemplo, C, una variable es una ubicación en la memoria identificada por un nombre específico. Por ejemplo, int i; significa que hay una variable de 4 bytes (generalmente) identificada por i . Esta ubicación de memoria se asigna independientemente de si se le asigna un valor todavía. Cuando C ejecuta i = 1000 , está cambiando el valor almacenado en la ubicación de memoria i a 1000.

En Python, la ubicación y el tamaño de la memoria son irrelevantes para el intérprete. El python más cercano a una “variable” en el sentido de C es un valor (por ejemplo, 1000) que existe como un objeto en algún lugar de la memoria, con o sin un nombre adjunto. La vinculación a un nombre pasa por i = 1000 . Esto le dice a Python que cree un objeto entero con un valor de 1000, si aún no existe, y se enlaza al nombre ‘i’. Un objeto se puede vincular a varios nombres con bastante facilidad, por ejemplo:

 >>> a = [] # Create a new list object and bind it to the name 'a' >>> b = a # Get the object bound to the name 'a' and bind it to the name 'b' >>> a is b # Are the names 'a' and 'b' bound to the same object? True 

Esto explica la diferencia entre los términos, pero siempre que entienda la diferencia, realmente no importa cuál use. A menos que seas pedante.

No estoy seguro de que el nombre / descripción de enlace sea lo más fácil de entender, por ejemplo, siempre me ha confundido, incluso si tengo una comprensión bastante precisa de cómo funciona Python (y cpython en particular).

La forma más sencilla de describir cómo funciona Python si viene de un fondo en C es entender que todas las variables en Python son punteros a objetos y, por ejemplo, que un objeto de list es una matriz de punteros a valores. Después de a = b tanto a como b apuntan al mismo objeto.

Hay un par de partes difíciles en las que este modelo simple de semántica de Python parece fallar, por ejemplo, con el operador aumentado de list += pero para eso es importante tener en cuenta que a += b en Python no es lo mismo que a = a + b pero es una operación de incremento especial (que también se puede definir para los tipos de usuario con el método __iadd__ ; a += b es de hecho a = a.__iadd__(b) ).

Otra cosa importante que hay que entender es que, mientras que en Python, todas las variables son, de hecho, punteros, aún no hay un concepto de puntero. En otras palabras, no puede pasar un “puntero a una variable” a una función para que la función pueda cambiar la variable: lo que en C ++ se define por

 void increment(int &x) { x += 1; } 

o en C por

 void increment(int *x) { *x += 1; } 

en Python no se puede definir porque no hay forma de pasar “una variable”, solo se pueden pasar “valores”. La única forma de pasar un lugar de escritura genérico en Python es usar un cierre de callback.

quien dijo que deberias A menos que esté discutiendo temas que están directamente relacionados con las operaciones de enlace de nombres; está perfectamente bien hablar de variables y asignaciones en Python como en cualquier otro idioma. Naturalmente, el significado preciso es diferente en diferentes lenguajes de progtwigción.

Si está depurando un problema relacionado con “Nombrar y enlazar”, use esta terminología porque la referencia del lenguaje Python lo usa: para ser lo más específico y preciso posible, para ayudar a resolver el problema evitando ambigüedades innecesarias.

Por otro lado, si quieres saber cuál es la diferencia entre las variables en C y Python, estas imágenes pueden ser de ayuda .

Yo diría que la distinción es significativa debido a varias de las diferencias entre C y Python:

  1. Escritura de pato: una variable C es siempre una instancia de un tipo determinado: en Python no es el tipo al que un nombre puede cambiar.

  2. Copias poco profundas – Pruebe lo siguiente:

     >>> a = [4, 5, 6] >>> b = a >>> b[1] = 0 >>> a [4, 0, 6] >>> b = 3 >>> a [4, 0, 6] 

Esto tiene sentido ya que a y b son ambos nombres que pasan parte del tiempo ligado a una instancia de lista en lugar de ser variables separadas.