/ / Como funcionam os escopos em python (Acessando uma variável externa de uma função interna) [duplicado] - python, variáveis, escopo

Como funcionam os escopos no python (Acessando uma variável externa de uma função interna) [duplicado] - python, variáveis, escopo

Alguém pode explicar como escopos funcionam em python Ipensei que eu entendi, mas há uma coisa que eu não entendo. Neste exemplo 1 eu uso a palavra-chave global para acessar variáveis ​​globais, mas e se você definir uma variável, xem uma função função, tente acessar essa variável em outra função, sub função, que é definido na função principal (exemplo 2).

Exemplo 1

x = 10
def function():
def sub_function():
global x
x += 1
sub_function()
function()

Exemplo 2

def function():
x = 10
def sub_function():
x += 1
sub_function()
function()

isso dá erro "UnboundLocalError: variável local" x "referenciada antes da atribuição"

Eu assumi que desde que x está em função () écriado em alguma pilha e só é removido após funcition () sai do escopo. sub_function () está no escopo de function (), então x ainda deve estar disponível.

Atualizar Eu entendo que python precisa da palavra-chave global para se referir a uma variável global para modificá-lo. Mas o que acontece se a variável não é global, mas não no meu escopo. Basicamente x no exemplo 2 não é global ... é isso?

Respostas:

0 para resposta № 1

O problema é que o Python, por padrão, permite que você leia variáveis ​​definidas no escopo pai, desde que você não tente sobrescrevê-las.

def function():
x = 10
def sub_function():
x = x + 1 # here Python is not really sure if you want
# to define the x variable in local scope or
# you"re trying to modify the global variable.
# Since you"re mutating the variable, Python assumes
# that x must be local variable which you forgot to
# define.

y = x + 1 # would raise no error.

Em Python 3x você pode usar nonlocal construir, mas no Python 2x a única opção é usar uma variável mutável dizer x = [10] ou copie x em outra variável de escopo local.

def function():
x = 10
def sub_function():
y = x # create an alias of x for mutable variables
y = y + 1 # would raise no error