Como o Python gerencia globals?

Eu me deparei com algumas manipulações muito estranhas de variáveis ​​globais no Python. Eu esperava que alguém pudesse explicar e justificar essas surpresas!

A) Este código imprime 10 conforme o esperado:

def func():
  print(a)
a = 10
func()

B) Este código lança uma exceção sobre referenciamento muito cedo:

def func():
  print(a)
  a += 1
a = 10
func()

C) Mas esse código imprime [10] conforme o esperado:

def func():
  print(a)
  a.append(1)
a = [10]
func()

Então eu posso entender que o tipo dea muda seu escopo e adicionalmente declarações posteriores que ainda nem foram alcançadas mudam comoa é visto. Eu sei que posso usarglobal a no início da função, mas é bastante detalhado.

Alguém pode me dizer quais regras o Python está usando para lidar com seu escopo bizarro?

questionAnswers(2)

yourAnswerToTheQuestion