Объявите d
как nonlocal
. Это сделает ячейку «доступной для записи» из внутренней функции.
c
работает, потому что вы изменяете объект на месте, однако «неявное объявление» Python (присваивание переменной ) всегда объявляет имена в локальной области . Поэтому, когда вы пытаетесь обновить нелокальную или глобальную переменную, вместо этого происходит то, что переменная с тем же именем объявляется как локальная функция.
Операторы global
и nonlocal
переопределяют эту неявную объявление, и вместо этого объявить, что переменная (и) указанного имени (ей) соответственно глобальны для модуля или в некоторой области действия функции, а не локальны для функции. Назначения будут затем «перенесены» в надлежащую область, а не явным образом вызовут объявление локальной переменной.