Pergunta

Esta questão já tem uma resposta aqui:

Eu estou tentando descobrir isso:

c = 1
def f(n):
    print c + n 
def g(n):
    c = c + n

f(1) => 2
g(1) => UnboundLocalError: local variable 'c' referenced before assignment

Obrigado!

Foi útil?

Solução

Dentro de uma função, variáveis ??que são atribuídas a são tratados como variáveis ??locais por padrão. Para atribuir a variáveis ??globais, utilize o href="https://docs.python.org/3/reference/simple_stmts.html#the-global-statement" rel="noreferrer"> global declaração

def g(n):
    global c
    c = c + n

Esta é uma das áreas peculiares de Python que nunca foi realmente se sentou bem comigo.

Outras dicas

estado global é algo a ser evitado, especialmente a necessidade de transformar-lo. Considere se g() deve simplesmente tomar dois parâmetros ou se f() e necessidade g() a ser métodos de uma classe comum com c um atributo instância

class A:
    c = 1
    def f(self, n):
        print self.c + n
    def g(self, n):
        self.c += n

a = A()
a.f(1)
a.g(1)
a.f(1)

Saídas:

2
3

Errata para de Greg pós :

Não deve haver nenhuma antes de serem referenciadas . Dê uma olhada:

x = 1
def explode():
    print x # raises UnboundLocalError here
    x = 2

Ela explode, mesmo que x é atribuído depois que ele é referenciado. Em Python variável pode ser local ou consulte escopo externo, e não pode mudar em uma função.

Além do que Greg disse, em Python 3.0, haverá a declaração não local para o estado "aqui estão alguns nomes que estão definidos no escopo delimitador". Ao contrário mundial desses nomes tem que ser já definido fora do escopo atual. Vai ser fácil para rastrear nomes e variáveis. Hoje em dia você não pode ter certeza de onde "globals algo" é exatamente definido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top