resumo: para resolver um UnboundLocalError quando a variável local é reatribuída após o primeiro uso, você pode usar a palavra-chave global ou a palavra-chave nonlocal. A palavra-chave global permite modificar os valores de uma variável global de dentro do escopo local de uma função, enquanto a palavra-chave nonlocal fornece funcionalidade semelhante no caso de funções aninhadas.

problema: dada uma variável local. Como resolver um UnboundLocalError quando a variável local é reatribuída após o primeiro uso?

Exemplo:

val = 100def func(): val = val + 100 print(val)func()

Saída:

Traceback (most recent call last): File "C:/Users/Shubham-PC/PycharmProjects/pythonProject1/main.py", line 9, in <module> func() File "C:/Users/Shubham-PC/PycharmProjects/pythonProject1/main.py", line 5, in func val = val + 100UnboundLocalError: local variable 'val' referenced before assignment

Antes de lidar com as soluções para o nosso problema, devemos entender a causa raiz atrás UnboundLocalError.

Causa Raiz De UnboundLocalErrors:

Quando uma variável é atribuído dentro de uma função, ela é tratada como uma variável local por padrão em Python. Se uma variável local for referenciada antes que um valor tenha sido atribuído / vinculado a ela, um UnboundLocalError será gerado. No exemplo acima, quando a variável 'val' é lida pelo interpretador Python dentro da função func(), ela assume que 'val' é uma variável local. No entanto, ele logo percebe que a variável local foi referenciada antes que qualquer valor fosse atribuído a ela dentro da função. Assim, lança um UnboundLocalError.

em outras palavras, só podemos acessar uma variável global dentro de uma função, mas não podemos modificá-la de dentro da função (a menos que você force uma atribuição global ou não local usando as palavras-chave global ou nonlocal).

Nota: A classe pai de todas as exceções Python é BaseException. O diagrama a seguir representa a hierarquia de exceção do UnboundLocalError.

hierarquia de exceção UnboundLocalError

agora que sabemos por que e quando um UnboundLocalError é levantado, vamos dar uma olhada nas soluções prováveis para superar esse erro.

Índice

Método 1: Usando a palavra-chave global

podemos usar a palavra-chave global para acessar e modificar uma variável global a partir do escopo local de uma função. Qualquer variável criada fora de uma função é global por padrão, enquanto qualquer variável criada dentro da função é local por padrão. Assim, para modificar uma variável global de dentro da função e evitar uma UnboundLocalError, podemos usar a palavra-chave global.

Vamos dar uma olhada no código a seguir, que simplifica o conceito acima:

val = 100print("Value at First Usage: ", val)def func(): global val val = val + 100 print("Output after Modification within func(): ", val)func()

Saída:

Value at First Usage: 100Output after Modification within func(): 200

Método 2: Usando a não-Palavra-chave

O nonlocal palavra-chave é usado quando temos uma função aninhada. Em tal situação, o escopo local de uma variável pode não ser definido, ou seja, o escopo de uma variável não é local nem global. Vamos dar uma olhada no exemplo a seguir para entender o uso da palavra-chave nonlocal para lidar com nosso problema.

def func(): val = 50 print("Output of func:", val) def foo(): nonlocal val val = val + 100 print("Output of foo:", val) foo() print("Output of func() after changes made to foo():", val)func()

saída

Output of func: 50Output of foo: 150Output of func() after changes made to foo(): 150

no programa acima, a palavra-chave nonlocal é usada com a variável val dentro da função aninhada foo() para criar uma variável não local. Se o valor da variável nonlocal mudar, as alterações também serão refletidas na variável local.

Disclaimer: A Palavra-chave nonlocal funciona apenas em Python 3 e acima.

Método 3: Usando Um Objeto Mutável

Desde nonlocal não funciona em versões do Python Python 3, você pode usar um objeto mutável como um dicionário python, para armazenar os valores, se você não deseja criar uma variável global. Vamos dar uma olhada no seguinte programa para entender o uso de um objeto mutável, a fim de superar o UnboundLocalError.

variables = { # creating a mutable object/dictionary 'val': 100}print('Output before Modification of val: ', variables)def func(): variables += 50 print('Output after Modification of val: ', variables)func()
Output before Modification of val: 100Output after Modification of val: 150

Método 4: passando parâmetros para a função

esta é a maneira tradicional de resolver nosso problema. Em vez de usar uma variável global, podemos passar parâmetros para a função definida para evitar um UnboundLocalError. Vamos ter um olhar para o código a seguir para ver como isso pode ser feito:

val = 100print("Value of val at first use: ", val)def func(v): v = v + 100 print("Output of val after modification:", v)func(val)

Saída:

Value of val at first use: 100Output of val after modification: 200

Palavra-chave Global vs Não-Palavra-chave

Antes de concluir este artigo, vamos ter um olhar para as diferenças fundamentais entre um global e nonlocal variável/palavras-chave.

  1. ao contrário da palavra-chave global, a palavra-chave nonlocal funciona apenas em Python 3 e acima.
  2. a palavra-chave global pode ser usada com variáveis globais pré-existentes ou novas variáveis, enquanto a palavra-chave nonlocal deve ser definida com uma variável pré-existente.

Conclusão

a Partir da discussão acima, nós aprendemos que, para lidar com UnboundLocalError em nosso código, podemos usar um dos seguintes métodos:

  1. Use o global palavra-chave.
  2. Use a palavra-chave nonlocal no caso de funções aninhadas.
  3. Use um objeto mutável.
  4. passar parâmetros para uma função.

espero que você tenha achado este artigo útil e depois de lê-lo, você possa lidar com UnboundLocalError com facilidade. Por favor, fique atento para artigos mais interessantes.

para onde ir daqui?

teoria suficiente, vamos praticar!

para ter sucesso na codificação, você precisa sair e resolver problemas reais para pessoas reais. É assim que você pode se tornar um ganhador de seis dígitos facilmente. E é assim que você aprimora as habilidades que realmente precisa na prática. Afinal, qual é o uso da teoria da aprendizagem que ninguém precisa?

Practice projects é como você aguça sua serra na codificação!Você quer se tornar um mestre de código concentrando-se em projetos de código práticos que realmente ganham dinheiro e resolvem problemas para as pessoas?

em seguida, torne-se um desenvolvedor freelance Python! É a melhor maneira de abordar a tarefa de melhorar suas habilidades em Python—mesmo se você for um iniciante completo.

Junte-se ao meu webinar gratuito “Como construir sua habilidade de Alta Renda Python” e veja como eu cresci meu negócio de codificação online e como você pode, também—a partir do conforto da sua própria casa.

Participe do webinar gratuito agora!