Я новичок в Python и использую книгу Марка Лутца, чтобы изучить основы Python.
Вот пример, который автор использует для демонстрации хранения информации о состоянии с использованием списков:
def tester(start):
def nested(label):
print(label,state[0])
state[0] += 1
state = [start]
return nested
Вот код для проверки информации о состоянии:
F = tester(3)
F('sam')
F('sam')
Вы увидитечто счетчик увеличивается с 3, а затем продолжается.По сути, вышеприведенный код сохраняет начальное состояние start
(переданное во время инициализации объекта) в [state]
и увеличивает его каждый раз, когда вызывается label
.
Однако я не уверен, почему Python не выдает ошибку в блоке nested
.В частности, [state]
является локальным по отношению к tester
, а не nested.
Чтобы продемонстрировать, что я имею в виду, я собираюсь заменить state[0]
на state.
def tester(start):
def nested(label):
print(label,state) #Replaced state[0] with state
state += 1 #Replaced state[0] with state
print("after:",state)
state = start #Replaced state[0] with state
return nested
ТехническиВышеприведенный код также должен работать нормально, потому что все, что я сделал, это заменил список переменной.Однако PyCharm даже не запускает этот код.Я получаю сообщение об ошибке nboundLocalError: local variable 'state' referenced before assignment
Может кто-нибудь объяснить, почему версия с list
работает нормально?Автор заявил, что «это использует изменчивость списков и основывается на том факте, что объект на месте не классифицирует имя как локальное».
Я не совсем уверен, что это значит.Может кто-нибудь, пожалуйста, помогите мне?Спасибо за любую помощь, оказанную мне.