Pregunta

envié una referencia a un objeto bool, y he modificado dentro de un método. Después de que el método de acabado es la ejecución, el valor de la bool fuera del método se mantuvo sin cambios.

Esto me lleva a creer que Bools de Python se pasan por valor. ¿Es eso cierto? ¿Qué otros tipos de Python se comportan de esa manera?

¿Fue útil?

Solución

variables de Python no son "referencias" en el sentido de C ++. Más bien, son simplemente nombres locales con destino a un objeto en algún lugar arbitrario en la memoria. Si ese objeto en sí es mutable, cambios en él serán visibles en otros ámbitos que han consolidado un nombre al objeto. Muchos tipos primitivos (incluyendo bool, int, str y tuple) son inmutable sin embargo. No puede cambiar su valor en el lugar; más bien, se asigna un nuevo valor para el mismo nombre en el ámbito local.

De hecho, casi cualquier momento * ve el código de la forma foo = X, significa que el nombre foo se le asigna un nuevo valor (X) dentro de su espacio de nombres actual, no es un lugar en la memoria nombrado por foo está teniendo su puntero interno actualizado para referirse en cambio a la ubicación de X.

* -. La única excepción a esto es en Python métodos setter de propiedades, lo que puede permitir que usted pueda escribir obj.foo = X y lo han vuelto a escribir en el fondo en lugar de llamar un método como obj.setFoo(X)

Otros consejos

Depende de si el objeto es mutable o inmutable. Los objetos inmutables se comportan como se vio con el bool, mientras que los objetos mutables van a cambiar.

Para referencia: http://www.testingreflections.com/node/view/5126

  

Python pasa referencias-a-objetos por valor (como Java), y todo en Python es un objeto. Esto suena simple, pero entonces se dará cuenta de que algunos tipos de datos parecen mostrar características de pasar por valor, mientras que otros parecen actuar como el paso por referencia ... ¿cuál es el problema?

     

Es importante entender los objetos mutables e inmutables. Algunos objetos, como cuerdas, tuplas, y los números, son inmutables. La alteración de ellos dentro de una función / método creará una nueva instancia y la instancia original fuera de la función / método no se cambia. Otros objetos, como listas y diccionarios son mutables, lo que significa que puede cambiar el objeto in situ. Por lo tanto, la alteración de un objeto dentro de una función / método será también cambiar el objeto original fuera.

Lo que hay que recordar es que no es no forma en Python para una función o un método para volver a enlazar un nombre en el espacio de nombres llamado. Cuando se escribe "Envié una referencia a un objeto de bool, y he modificado dentro de un método", lo que realmente hizo (que supongo) era volver a enlazar el nombre del parámetro (para la que el valor bool estaba obligado por la llamada) en el interior el cuerpo del método.

En resumen, No existen variables en Python ; hay objetos (como verdadero y falso, los Bools resultan ser inmutable), y nombres. Los nombres son lo que se llama las variables, pero los nombres pertenecen a un ámbito, normalmente no se puede cambiar nombres distintos a los nombres locales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top