No creo que hay alguna razón de ser de tal comportamiento.
Pero por lo que yo sé, Stefano, se utiliza una terminología equivocada. En su código no hay instrucción de asignación solo la inicialización de variable (var) usando la expresión de inicialización (0).
integer :: var = 0 ! type declaration & initialization
integer :: var ! type declaration
var = 0 ! assignment
Parece que fue solo decisión del comité de diseño. Si tenemos dicha expresión (con el signo de igualdad en el enunciado de declaración de tipo) es la inicialización, no la asignación. Y la inicialización solo tiene lugar una vez durante la ejecución del programa (y no de los procedimientos).
Sin embargo puede haber algunas razones históricas de tal decisión. Eche un vistazo al hilo this.
Hoy en día este tipo de comportamiento es peligroso debido a que muchos otros idiomas ampliamente usados sigue a otro convenciones sobre la inicialización/asignación.
En aras de la exhaustividad, quisiera mencionar que en la norma Fortran 2003 el punto que mencionas está cubierto de C1107: "Si un objeto de un tipo para el que se especifica componente de inicialización (R444) aparece en la especificación partes de un módulo y no tiene el atributo ALLOCATABLE o POINTER, el objeto tendrá el atributo SAVE ". –
@Alexandros Gezerlis - Correcto, pero él pregunta "por qué" hicieron las cosas de esta manera, y ahora que entiendo su pregunta, también tengo la misma pregunta :). – dcp
Lo sé, es por eso que no publiqué esto como una respuesta. –