15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

print('Found:', found)

print(numbers)

>>>

Found: False

[2, 3, 5, 7, 1, 4, 6, 8]

Os resultados ordenados estão corretos, mas o resultado de found está errado. Os

itens de group foram efetivamente encontrados no conjunto numbers, mas a

função retornou False. Por que isso aconteceu?

Quando uma variável é referenciada em uma expressão, o interpretador Python

irá cruzar os limites de escopo para tentar resolver a referência, na seguinte

ordem:

1. O escopo da função atual.

2. Quaisquer escopos que contenham o atual (por exemplo, funções que

declarem a atual).

3. O escopo do módulo que contém o código (também chamado de global

scope ou escopo global).

4. O escopo nativo (que contém funções como len e str).

Se nenhum desses locais possuir uma variável definida com o nome

referenciado, uma exceção NameError é gerada.

A atribuição de um valor a uma variável funciona de forma diferente. Se a

variável já estiver definida no escopo atual, ela assumirá o novo valor. Se a

variável não existir no escopo atual, o Python considera a atribuição como uma

definição de variável. O escopo da nova variável é a função que contém a

atribuição.

O comportamento de atribuição explica o valor de retorno incorreto na função

sort_priority2. O valor True foi atribuído à variável found no closure chamado

helper. A atribuição no closure é encarada como uma nova definição de variável

dentro do escopo de helper, e não como uma atribuição no escopo de

sort_priority2.

def sort_priority2(numbers, group):

found = False # Aqui o escopo é 'sort_priority2'

def helper(x):

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!