HOWTO · Python

Como declarar uma variável sem valor em Python

Aprenda como o Python trata um nome não vinculado, um marcador de posição `None`, uma anotação sem atribuição e valores de string ou lista vazias.

Nesta página

Para preparar uma variável para um valor que você fornecerá mais tarde, atribua None como marcador de posição. O Python vincula um nome somente quando uma atribuição é executada; simplesmente mencionar um nome ou escrever uma anotação não lhe dá um valor em tempo de execução. Use uma anotação de variável quando precisar registrar um tipo sem atribuir nada, ou atribua uma string ou lista vazia quando esse for o valor com o qual deseja começar.

Como o Python lida com uma variável sem valor atribuído

Em Python, a atribuição cria um vínculo entre um nome e um objeto. Um nome que não foi atribuído no escopo atual está não vinculado. Lê-lo gera NameError; não é uma variável que contém um valor especial de “nada”. Essa distinção é importante ao escolher como representar dados que serão fornecidos mais tarde.

As opções abaixo criam estados diferentes: None é um marcador de posição atribuído, uma anotação registra informações de tipo sem atribuir um valor, e uma string ou lista vazia é um objeto atribuído que pode ser usado imediatamente.

Atribuir None como marcador de posição

Atribua None quando o nome deve existir agora, mas o valor significativo ainda não está disponível. None é o objeto singleton do Python para representar a ausência; atribuí-lo vincula o nome, portanto é diferente de deixar o nome não vinculado. Verifique-o com is None.

Execute este exemplo completo para comparar as três escolhas:

profile = None
message = ""
items = []

if profile is None:
    profile = {"name": "Ada"}

message += "Hello"
items.append("first")

print(profile["name"])
print(message)
print(items)

Após a verificação, profile refere-se a um dicionário. Um valor padrão de parâmetro None distingue um argumento omitido de um valor fornecido que não é None, porque o valor fornecido substitui o padrão. Ele não pode distinguir a omissão de um None explícito; use um objeto sentinela único como padrão quando essas chamadas precisarem ser tratadas de maneira diferente.

Usar uma anotação de variável sem atribuir um valor

Uma anotação de variável pode registrar o tipo pretendido sem vincular um valor em tempo de execução ao nome:

name: str

Isso é uma anotação, não uma atribuição. A anotação pode estar disponível por meio dos dados de anotação do módulo ou da classe que a contém, mas ler name antes de atribuir-lhe um valor ainda gera NameError. Se o código posterior precisar ler o valor, atribua um primeiro, como name = "Ada". Use a sintaxe somente de anotação quando for útil documentar o tipo pretendido e a atribuição deva acontecer em outro lugar.

Usar uma string ou lista vazia quando um valor vazio é pretendido

Atribua um valor vazio quando ele já for o valor inicial correto para a sua tarefa. Uma string vazia ainda é uma string, e uma lista vazia ainda é uma lista; nenhuma delas representa um nome não vinculado ou um marcador de posição None.

O exemplo acima começa message como uma string vazia e items como uma lista vazia, e depois adiciona conteúdo. Escolha o tipo que corresponde aos dados que você planeja armazenar. Uma lista pode ser preenchida mais tarde com métodos como append() ou extend().

Escolher a forma que corresponde à sua intenção

  • Use None quando a ausência for significativa e o nome já deve estar vinculado. Verifique-o com is None antes de substituir ou usar o marcador de posição.
  • Use uma anotação como name: str quando precisar registrar o tipo pretendido, mas não quiser atribuir um valor nesse ponto. Ela não torna o nome legível em tempo de execução.
  • Use "" ou [] quando uma string ou coleção vazia for o valor inicial real de que o seu código precisa.

Se uma leitura gerar NameError, verifique primeiro se uma atribuição foi executada nesse escopo. Atribua None se precisar de um marcador de posição, ou inicialize o valor que o seu código usará. Não use a sintaxe somente de anotação como substituto da inicialização em tempo de execução.