Saltar al contenido

¿Qué sucede cuando asignas el valor de una variable a otra variable en Python?

Después de de nuestra prolongada búsqueda de información resolvimos este conflicto que pueden tener ciertos los usuarios. Te regalamos la respuesta y esperamos resultarte de gran ayuda.

Solución:

Como desarrollador de C++, puede pensar en las variables de Python como punteros.

Por eso cuando escribes spam = 100esto significa que "asignas el puntero", que antes apuntaba al objeto 42para señalar el objeto 100.

Anteriormente, cheese fue asignado para apuntar al mismo objeto que spam señaló, que resultó ser 42 En ese tiempo. Como no has modificado cheesetodavía apunta a 42.

La inmutabilidad no tiene nada que ver con esto en este caso, ya que la asignación del puntero no cambia nada sobre el objeto al que se apunta.

A mi modo de ver, hay diferentes visiones de un idioma.

  • La perspectiva del "abogado del lenguaje".
  • La perspectiva del "programador práctico".
  • la perspectiva del "implementador".

Desde la perspectiva del abogado del lenguaje, las variables de Python siempre "apuntan a" un objeto. Sin embargo, a diferencia de Java y C++, el comportamiento de == <= >= etc. depende del tipo de tiempo de ejecución de los objetos a los que apuntan las variables. Además, en Python, la gestión de la memoria está a cargo del lenguaje.

Desde la perspectiva práctica de un programador, podemos tratar el hecho de que los números enteros, cadenas, tuplas, etc. son objetos inmutables* en lugar de valores directos como un detalle irrelevante. La excepción es cuando almacenamos grandes cantidades de datos numéricos, es posible que deseemos usar tipos que puedan almacenar los valores directamente (por ejemplo, matrices numpy) en lugar de tipos que terminarán con un array lleno de referencias a objetos diminutos.

Desde la perspectiva de los implementadores, la mayoría de los lenguajes tienen algún tipo de regla como si, de modo que si los comportamientos especificados son correctos, la implementación es correcta independientemente de cómo se hagan realmente las cosas bajo el capó.

Entonces, sí, su explicación es correcta desde la perspectiva de un abogado de idiomas. Su libro es correcto desde la perspectiva práctica del programador. Lo que realmente hace una implementación depende de la implementación. En cpython, los enteros son objetos reales, aunque los enteros de valor pequeño se toman de un grupo de caché en lugar de crearse de nuevo. No estoy seguro de qué hacen las otras implementaciones (por ejemplo, pypy y jython).

* tenga en cuenta la distinción entre objetos mutables e inmutables aquí. Con un objeto mutable, debemos tener cuidado al tratarlo "como un valor" porque algún otro código podría mutarlo. Con un objeto inmutable no tenemos tales preocupaciones.

Es correcto que puedas más o menos cosas de variables como punteros. Sin embargo, el código de ejemplo sería de gran ayuda para explicar cómo esto realmente está funcionando.

En primer lugar, utilizaremos en gran medida la id función:

Devuelve la “identidad” de un objeto. Este es un número entero que se garantiza que es único y constante para este objeto durante su vida útil. Dos objetos con vidas útiles que no se superponen pueden tener el mismo valor de id().

Es probable que esto devuelva diferentes valores absolutos en su máquina.

Considere este ejemplo:

>>> foo = 'a string'
>>> id(foo) 
4565302640
>>> bar = 'a different string'
>>> id(bar)
4565321816
>>> bar = foo
>>> id(bar) == id(foo)
True
>>> id(bar)
4565302640

Puedes ver eso:

  • El foo/bar original tiene diferentes ID, porque apuntan a diferentes objetos
  • Cuando bar se asigna a foo, sus ID ahora son los mismos. Esto es similar a que ambos apuntan a la misma ubicación en la memoria que ves al hacer un puntero C++

cuando cambiamos el valor de foo, se asigna a una identificación diferente:

>>> foo = 42
>>> id(foo)
4561661488
>>> foo = 'oh no'
>>> id(foo)
4565257832

Una observación interesante también es que los números enteros implícitamente tienen esta funcionalidad hasta 256:

>>> a = 100
>>> b = 100
>>> c = 100
>>> id(a) == id(b) == id(c)
True

Sin embargo, más allá de 256 esto ya no es true:

>>> a = 256
>>> b = 256
>>> id(a) == id(b)
True
>>> a = 257
>>> b = 257
>>> id(a) == id(b)
False

sin embargo asignando a para b de hecho, mantendrá la identificación igual que se muestra antes:

>>> a = b
>>> id(a) == id(b)
True

Sección de Reseñas y Valoraciones

Tienes la posibilidad mostrar esta noticia si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.