Usted mismo dice que con las lecturas no hay ambigüedad y con las escrituras hay. Por lo tanto, necesita algún mecanismo para resolver la ambigüedad con escrituras.
Una opción (posiblemente utilizada realmente por versiones mucho más antiguas de Python, IIRC) es simplemente decir que las escrituras siempre van al alcance local. Entonces no hay necesidad de una palabra clave global
, y no hay ambigüedad. Pero entonces no se puede escribir en variables globales (sin usar cosas como globals()
para obtenerlas de forma aproximada), así que eso no sería genial.
Otra opción, utilizada por los lenguajes que declaran variables estáticamente, es comunicar a la implementación del lenguaje por adelantado para cada alcance qué nombres son locales (los que declaras en ese alcance) y qué nombres son globales (nombres declarados en el alcance del módulo). Pero Python no tiene variables declaradas, por lo que esta solución no funciona.
Otra opción sería asignar x = 3
a una variable local solo si no hay un nombre en algún ámbito externo con el nombre x
. Parece que intuitivamente haría lo correcto? Sin embargo, conduciría a algunos casos de esquina seriamente desagradables. Actualmente, donde x = 3
escribirá está estáticamente determinado por el analizador sintáctico; o bien no hay global x
en el mismo ámbito y es una escritura local, o hay un global x
y es una escritura global. Pero si lo que hará dependerá del alcance del módulo global, deberá esperar hasta el tiempo de ejecución para determinar dónde va la escritura , lo que significa que puede cambiar entre las invocaciones de una función. Piénsalo. Cada vez que creas un global en un módulo, alterarías el comportamiento de todas las funciones en el módulo que pasó a usar ese nombre como un nombre de variable local. Realice un cálculo de alcance de módulo que use tmp
como una variable temporal y diga adiós al uso de tmp
en todas las funciones en el módulo. Y me estremece pensar en los bugs oscuros que implican la asignación de un atributo en un módulo que has importado y luego llamar a una función desde ese módulo. Yuck.
Y otra opción es comunicarse con la implementación del idioma en cada tarea, ya sea local o global. Esto es a lo que Python se ha ido. Dado que hay un valor predeterminado sensato que cubre casi todos los casos (escribir en una variable local), tenemos la asignación local como predeterminada y marca explícitamente las asignaciones globales con global
.
Existe una ambigüedad con las asignaciones que necesita algún mecanismo para resolverlo. global
es uno de esos mecanismos. No es el único posible, pero en el contexto de Python, parece que todos los mecanismos alternativos son horribles. No sé qué tipo de "mejor razón" estás buscando.
Para ocultar errores sutiles? – Inverse