valor resueltos recorrer lista elementos ejercicios diccionarios diccionario dentro declaracion convertir buscar agregar python variables dictionary global local

resueltos - El diccionario Python pasado como entrada a una función actúa como un global en esa función en lugar de un local.



lista dentro de un diccionario python (4)

Cuando pasas un objeto básico como un entero o una cadena a una función, si lo cambias dentro de la función, no ocurre nada con el objeto correspondiente fuera de la función porque cuando estás liderando con un objeto básico, Python lo pasa por valor.

Sin embargo, si pasa un diccionario o una lista a una función, se pasan por referencia, lo que significa que tendrá ese comportamiento: el objeto fuera de la función se modifica, como ha visto.

edición: Además, hay una diferencia entre pasar por valor o por referencia: por valor, se hace una "copia" del objeto para ser usada en la función; por referencia, el mismo objeto se pasa exactamente a través de la referencia y las modificaciones dentro de la función son visibles desde afuera. Por definición, Python pasa sus objetos inmutables por valor y sus objetos mutables por referencia.

Estoy muy confundido por el comportamiento a continuación. Los casos 1, 3 y 4 funcionan como yo esperaría, pero el caso 2 no lo hace. ¿Por qué el caso 2 permite que la función cambie el valor de la entrada del diccionario globalmente, aunque la función nunca devuelva el diccionario? Una razón principal por la que estoy usando funciones es aislar todo lo que está en la función del resto del código, pero esto no parece ser posible si elijo usar los mismos nombres de variables dentro de la función. Comprendí que cualquier cosa definida explícitamente en una función es local a esa función, pero esto no parece ser el caso si el diccionario se define y pasa como una entrada a la función .

Python 2.7.2+ (default, Oct 4 2011, 20:06:09) [GCC 4.6.1] on linux2 Type "help", "copyright", "credits" or "license" for more information.

============= Caso 1 ===============

>>> def testfun1(a): ... a=2 ... >>> a=0 >>> testfun1(a) >>> a 0

============= Caso 2 ===============

>>> def testfun2(b): ... b[''test'']=2 ... >>> b={} >>> testfun2(b) >>> b {''test'': 2}

============= Caso 3 ===============

>>> def testfun3(): ... c=2 ... >>> c=0 >>> testfun3() >>> c 0

============= Caso 4 =============== (explicado por esta pregunta: ¿ Los diccionarios globales no necesitan una palabra clave global para modificarlos? )

>>> def testfun4(): ... d[''test'']=10 ... >>> d={} >>> testfun4() >>> d {''test'': 10}


Ha pasado un objeto dict a la función y lo ha modificado dentro de la función, por lo que, por supuesto, se modificará después del retorno de la función. El objeto no se copia, por lo que modifica el mismo objeto que pasó, y esta pregunta no tiene nada que ver con la asignación de nombres, nombres similares, ámbitos, etc. a medida que pasaba el objeto explícitamente.


La palabra clave global es necesaria solo para la asignación (y probablemente del , nunca la he probado). Las mutaciones de los objetos son perfectamente válidas.


El paso de parámetros de Python actúa un poco diferente a los idiomas a los que probablemente esté acostumbrado . En lugar de tener un pase explícito por valor y pasar por semántica de referencia, Python tiene pase por nombre. Básicamente, siempre está pasando el objeto en sí, y la mutabilidad del objeto determina si se puede modificar o no. Las listas y los dictados son objetos mutables. Números, cadenas y tuplas no lo son.

Usted está pasando el diccionario a la función, no una copia. Por lo tanto, cuando lo modifica, también está modificando la copia original.

Para evitar esto, primero debe copiar el diccionario antes de llamar a la función, o desde dentro de la función (pasar el diccionario a la función dict debería hacerlo).