O código funciona parcialmente e gera um erro no final por causa do escopo da variável.
Dentro da função mensagem(), temos a variável saudacao, que é local, ou seja, só existe dentro da função. Já a variável nome foi definida fora da função, sendo global, então pode ser acessada dentro dela.
Quando chamamos:
mensagem()
A saída será:
Olá Daniel
Depois disso, temos:
print(nome)
Que funciona normalmente e imprime:
Daniel
Porém, ao executar:
print(saudacao)
O Python gera um erro:
NameError: name 'saudacao' is not defined
Isso acontece porque saudacao foi criada dentro da função e não existe fora dela.
Conclusão: variáveis locais não podem ser acessadas fora da função onde foram criadas, apenas variáveis globais têm esse alcance.