Hola Rafael,
No seu caso, você tem duas variáveis chamadas x em escopos diferentes.
- O primeiro dentro da função:
def func():
x = 1 # variável local na função
print(x)
x = 10 # variável global
func()
print(x)
Como grande parte das linguagens, variáveis globais são declaradas na raiz da aplicação.
Quando se escreve uma função, repetidor (for, while...), comando de definição (if...)..., eles ganham um escopo próprio. Esse escopo no Python é definido pelos "espaços".
Quando foi definido x = 1, com aqueles espaços após a declaração de def func(): significa que você está declarando uma variável x no escopo da função func() e iniciando ela.
Porém, quando você escreve novamente x = 10 fora dos 'espaços', significa que está fora do escopo da função, e sim no escopo da aplicação (do arquivo que você está escrevendo). Por ser outro escopo, significa que você está declarando uma nova variável, também chamada x.
Então:
- Função --> x = 1
- Aplicação --> x = 10
Como cada print também está em escopo diferente, é imprimido o x do escopo aonde o print está.
Espero ter ajudado \\//_