Eu sou novo no Python, então essa é provavelmente uma questão de escopo simples. O código a seguir em um arquivo Python (módulo) está me confundindo um pouco:
if __name__ == '__main__':
x = 1
print x
Em outros idiomas em que trabalhei, esse código geraria uma exceção, pois a x
variável é local para oif
instrução e não deveria existir fora dela. Mas esse código é executado e imprime 1. Alguém pode explicar esse comportamento? Todas as variáveis criadas em um módulo são globais / disponíveis para todo o módulo?
python
variables
if-statement
scope
local-variables
froadie
fonte
fonte
if
afirmação acima não é verdadeira (ou seja,__name__
é não'__main__'
, por exemplo, quando você importa o módulo em vez de executá-lo de nível superior), entãox
nunca foram ligados, e da subsequenteprint x
declaração jogará aNameError: name 'x' is not defined
.Respostas:
As variáveis Python têm o escopo definido para a função, classe ou módulo mais interno ao qual são atribuídos. Blocos de controle como
if
ewhile
blocos não contam, portanto, uma variável atribuída dentro de umif
ainda tem escopo definido para uma função, classe ou módulo.(Funções implícitas definida por um gerador de expressão ou lista / set / dict compreensão fazer contagem, assim como expressões lambda. Você não pode encher uma declaração de atribuição em qualquer um desses, mas os parâmetros lambda e
for
alvos cláusula são atribuição implícita.)fonte
Sim, eles estão no mesmo "escopo local" e, na verdade, códigos como este são comuns no Python:
Observe que
x
não é declarado ou inicializado antes da condição, como seria em C ou Java, por exemplo.Em outras palavras, o Python não possui escopos no nível do bloco. Tenha cuidado, porém, com exemplos como
o que levantaria claramente uma
NameError
exceção.fonte
O escopo em python segue esta ordem:
Pesquise o escopo local
Pesquise o escopo de quaisquer funções anexas
Pesquise o escopo global
Pesquise os built-ins
( fonte )
Observe que
if
e outras construções de loop / ramificação não estão listadas - apenas classes, funções e módulos fornecem escopo no Python; portanto, qualquer coisa declarada em umif
bloco tem o mesmo escopo que qualquer coisa desclassificada fora do bloco. As variáveis não são verificadas no momento da compilação, e é por isso que outros idiomas lançam uma exceção. Em python, desde que a variável exista no momento em que você precisar, nenhuma exceção será lançada.fonte
Como Eli disse, o Python não requer declaração de variáveis. Em C você diria:
mas na declaração Python está implícita, portanto, quando você atribui x, ele é automaticamente declarado. É porque o Python é digitado dinamicamente - não funcionaria em uma linguagem estaticamente digitada, porque dependendo do caminho usado, uma variável pode ser usada sem ser declarada. Isso seria detectado no momento da compilação em um idioma estaticamente digitado, mas com um idioma digitado dinamicamente é permitido.
A única razão pela qual uma linguagem de tipo estaticamente é limitada a ter que declarar variáveis fora das
if
instruções devido a esse problema. Abrace a dinâmica!fonte
Diferente de linguagens como C, uma variável Python está no escopo de toda a função (ou classe ou módulo) em que aparece, não apenas no "bloco" mais interno. É como se você declarasse
int x
na parte superior da função (ou classe ou módulo), exceto que no Python você não precisa declarar variáveis.Observe que a existência da variável
x
é verificada apenas no tempo de execução - ou seja, quando você chega àprint x
instrução. Se__name__
não igual"__main__"
, então você gostaria de obter uma exceção:NameError: name 'x' is not defined
.fonte
Sim. Também é verdade para o
for
escopo. Mas não funciona, é claro.No seu exemplo: se a condição na
if
instrução for falsa,x
ela não será definida.fonte
você está executando esse código na linha de comando, portanto, as
if
condições são verdadeiras ex
estão definidas. Comparar:fonte
E observe que, como os tipos Python são verificados apenas no tempo de execução, você pode ter códigos como:
Mas estou tendo problemas para pensar em outras maneiras pelas quais o código funcionaria sem erros devido a problemas de tipo.
fonte