Breve descrizione delle regole di scoping?

| | |

Quali sono esattamente le regole di scoping di Python?

Se ho del codice:

code1 class Foo: code2 def spam.. ... code3 for code4..: code5 x() 

Dove si trova x? Alcune possibili scelte includono l'elenco seguente:

  1. Nel file sorgente che lo racchiude
  2. Nello spazio dei nomi della classe
  3. Nella definizione della funzione
  4. Nella variabile indice del ciclo for
  5. All'interno del ciclo for

Inoltre c'è il contesto durante l'esecuzione, quando la funzione spam è passato da qualche altra parte. E forse le funzioni lambda passano in modo leggermente diverso?

Ci deve essere un semplice riferimento o un algoritmo da qualche parte. È "un mondo confuso per i programmatori Python intermedi.