Область имени определяется при компиляции функции: присваивание делает имя локальным, если нет global или nonlocal. Это отличается от изменения объекта, на который имя уже ссылается.
Как Python определяет, какая переменная изменяется внутри функции?
Область имени определяется при компиляции функции: присваивание делает имя локальным, если нет global или nonlocal. Это отличается от изменения объекта, на который имя уже ссылается.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Область имени определяется при компиляции функции: присваивание делает имя локальным, если нет global или nonlocal. Это отличается от изменения объекта, на который имя уже ссылается.
В f(): x = x + 1 имя x локально во всей функции, поэтому чтение до присваивания приводит к UnboundLocalError, даже если снаружи есть x. global направляет присваивание в пространство модуля, nonlocal — к существующему имени внешней функции. При items.append(1) имя не перепривязывается: меняется объект. Сложение с присваиванием items += [...] включает перепривязку имени и потому влияет на определение области.