Каждая переменная имеет область видимости. Поиск имени (получение значения, на которое указывает имя) по умолчанию разрешается в самой внутренней области видимости. Вы можете переопределить имена только в локальной области или в содержащей области (используя ключевые слова nonlocal
и global
). Во втором примере в main вы назначаете myNumber
другой области действия, к которой может обращаться ваша забавная функция.
squares = []
for x in range(5):
squares.append(lambda: x**2) # scope = global / lambda
print(squares[2]())
def buildFunction():
myNumber = 6 # scope = global / buildFunction
def fun():
return myNumber # scope = global / buildFunction / fun
return fun
myNumber = 1 # scope = global
def main():
myNumber = 3 # scope = global / main. Out of scope for global / buildFunction
myFun = buildFunction()
print(myFun())
Когда вызывается fun
, Python просматривает локальную область действия fun
и не могу найти myNumber
. Таким образом, он смотрит на его содержание. Область действия buildFunction
имеет область действия myNumber
(myNumber = 6
), поэтому fun
возвращает 6
.
Если buildFunction
не имеет область действия myNumber
, то Python просматривает следующая сфера В моей версии глобальная область действия имеет myNumber = 1
, поэтому fun
вернет 1
.
Если myNumber
также не существует в глобальной области действия, NameError
повышается, потому что myNumber
может не может быть найдено ни в локальной области видимости, ни в какой-либо из содержащих его областей.