Escopo Lexical vs escopo dinâmico

Então eu tenho esse problema onde eu tenho que descobrir a saída usando duas regras de escopo diferentes. Eu sei que a saída usando o escopo léxico éa=3 eb=1, mas estou tendo dificuldade em descobrir a saída usando o escopo dinâmico.
Nota: o exemplo de código a seguir usa a sintaxe C, mas vamos tratá-lo como pseudo-código.

int a,b;

int p() {
    int a, p;
    a = 0; b = 1; p = 2;
    return p;
}

void print() {
    printf("%d\n%d\n",a,b);
}

void q () {
    int b;
    a = 3; b = 4;
    print();
}

main() {
    a = p();
    q();
}

Aqui está o que eu invento. Usando o escopo Dinâmico, as referências não-locais aa eb pode mudar. Então eu tenhoa=2 (retorne de p ()), entãob=4 (dentro de q ()). Então a saída é2 4?

questionAnswers(2)

yourAnswerToTheQuestion