Чтобы добавить ответ Алекса: хотя, когда вы опускаете местные житель/глобал аргументы они по умолчанию для местных жителей и глобал вызывающего абонента, это всего лишь удобство взлома; он не означает, что они наследуют полный контекст выполнения вызывающего. В частности:
a. вложенные ячейки области недоступны исполняемому коду. Так что это не удается:
def f():
foo= 1
def g():
exec('print foo')
g()
f()
b. global
декларации не переносятся в исполняемый код. Таким образом, по умолчанию, как и в вашем примере, записанные переменные помещаются в словарь locals. Тем не менее, вы можете заставить его работать, говоря:
exec('global myvar\nmyvar = "changed!"')
Вы действительно не хотите делать это, если сможете это сделать. global
уже не приятно и exec
- это в значительной степени запах кода сам по себе! Вы не хотели бы сочетать их, если бы не было никакой альтернативы.
Отлично! Спасибо, он отлично работает. :) – linkmaster03