"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como a função `exec` se comporta de maneira diferente no Python 2 e no Python 3?

Como a função `exec` se comporta de maneira diferente no Python 2 e no Python 3?

Publicado em 19/11/2024
Navegar:677

How does the `exec` function behave differently in Python 2 and Python 3?

Comportamento da função exec em Python 2 e Python 3

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.

Comportamento do Python 2

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.

Comportamento do Python 3

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.

Solução alternativa correta

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.

Exemplo Código

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.

Tutorial mais recente Mais>

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