A função exec exibe um comportamento distinto entre Python 2 e Python 3. Em Python 2, exec é uma instrução, enquanto no Python 3, ele fez a transição para uma função. Essa distinção tem implicações significativas para sua interação com variáveis locais.
No Python 2, a instrução exec permite a modificação de variáveis locais dentro do escopo de uma função. Quando a instrução exec é executada, o compilador Python desativa temporariamente as otimizações de escopo local e muda para uma estratégia de pesquisa mais lenta para acessar variáveis locais e globais. Além disso, quaisquer variáveis declaradas na instrução exec são automaticamente copiadas de volta para os locais da função se nenhum parâmetro global e local explícito for fornecido.
No Python 3, o exec() a função segue estritamente as regras do escopo da função. Não é mais possível modificar variáveis no escopo local de uma função, mesmo que tenham sido declaradas anteriormente. Locals() é capaz de refletir variáveis locais em uma direção, mas permitir modificações por meio de locals() nunca foi suportado.
Para alcançar o comportamento desejado observado no Python 2, ele é necessário utilizar um namespace separado ao chamar exec() em Python 3. Ao passar um dicionário personalizado para a função exec(), é possível modificar e acessar variáveis dentro desse namespace.
O código a seguir demonstra a maneira correta de usar exec() em Python 3:
def execute(a, st): namespace = {} exec("b = {}\nprint('b:', b)".format(st), namespace) print(namespace['b'])
Essa abordagem garante que o escopo local da função permaneça intacto, ao mesmo tempo que permite modificações nas variáveis dentro do namespace definido.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3