Python предполагает, что переменная является локальной, если и только если она назначена, в текущем блоке кода. Так
spam = 0
def ham:
print( spam )
сделает спам глобальной переменной, но
spam = 0
def ham:
spam = 0
print( spam )
создаст отдельную переменную, локальную для ham
. Закрытие захватывает все переменные, локальные для охватывающей области видимости. В вашем первом примере нет локальных переменных, поэтому нет замыкания; во втором localname
назначается и, следовательно, method
является замыканием.
Как всегда в Python, есть способы обойти это предположение. Ключевое слово global
объявляет переменную как глобальную (!), Например,
spam = 0
def ham:
global spam
spam = 0
print( spam )
будет , а не будет закрытием. Py3k вводит ключевое слово nonlocal
, которое говорит Python смотреть вверх через области видимости, пока не найдет имя переменной и не обратится к ней.