Ámbito de la función de Python (Diccionarios v. Cadenas)

foo = “foo” def bar (foo): foo = “bar”

bar(foo) print foo # foo is still "foo"... foo = {'foo':"foo"} def bar(foo): foo['foo'] = "bar" bar(foo) print foo['foo'] # foo['foo'] is now "bar"? 

Tengo una función que sobrescribió inadvertidamente mis parámetros de función cuando paso un diccionario. ¿Hay una forma clara de declarar que mis parámetros son constantes o estoy atascado haciendo una copia del diccionario dentro de la función?

¡Gracias!

En un caso como este, tendría que copiar el diccionario si desea cambiarlo y mantener los cambios locales en la función.

La razón es que, cuando pasa un diccionario a su segunda función de bar , Python solo pasa una referencia al diccionario. Entonces, cuando lo modifica dentro de la función, está modificando el mismo objeto que existe fuera de la función. En la primera función de bar , por otro lado, asigna un objeto diferente al nombre foo dentro de la función cuando escribe foo = "bar" . Cuando haces eso, el nombre foo dentro de la función comienza a referirse a la cadena "bar" y no a la cadena "foo" . Has cambiado a qué objeto se refiere el nombre. Pero foo dentro de la función y foo fuera de la función tienen nombres diferentes, por lo tanto, si cambia el objeto etiquetado por foo dentro de la función, no afectará el nombre foo fuera de la función. Así que se refieren a diferentes objetos.

Los argumentos se pasan por valor, pero en este caso el valor es una referencia a un objeto. Esto también se llama llamada por compartir . Entonces sí, si necesita un nuevo diccionario, tendrá que crear uno en la función.

Me gustaría añadir que

 temp_dict = CONSTdict 

No ayudó, ya que esto simplemente copia el puntero.

En su lugar, necesitaba:

 temp_dict = dict(CONSTdict) 

Aclamaciones,

Shaun