1
resposta

[Dúvida] Escopo de variável

Olá!

Estou na aula 07. Melhorando o seu código - item 03 - Criando mais funções.

A função sugerida pelo professor marca_chute_correto(chute, letras_acertadas, palavra_secreta) possui a seguinte implementação que me causou uma dúvida:

  • A variável letras_acertadas está definida dentro do corpo da função jogar() entretanto a função marca_chute_correto() modifica essa variável internamente na própria função. No que pese ela ser passada na assinatura da função, dentro do corpo da função marca_chute_correto() a variável letras_acertadas não deveria ser uma cópia da mesma variável definida na função jogar() e, consequentemente, as alterações realizadas nesse escopo deveriam ficar restritas a ele? Qual é o comportamento das variáveis recebidas na assinatura da função com relação a variável original da função que chamou essa nova função?

Segue código:

import random

def jogar():

    imprime_mensagem_abertura()
    palavra_secreta = carrega_palavra_secreta()

    letras_acertadas = inicializa_letras_acertadas(palavra_secreta)
    print(letras_acertadas)

    enforcou = False
    acertou = False
    erros = 0

    while (not acertou and not enforcou):

        chute = pede_chute()

        if (chute in palavra_secreta):
            marca_chute_correto(chute, letras_acertadas, palavra_secreta)
        else:
            erros += 1

        enforcou = erros == 6
        acertou = "_" not in letras_acertadas
        print(letras_acertadas)

    if (acertou):
        print("Você ganhou!")
    else:
        print("Você perdeu!")

    print("Fim do jogo")

def marca_chute_correto(chute, letras_acertadas, palavra_secreta):
    index = 0
    for letra in palavra_secreta:
        if (chute == letra):
            letras_acertadas[index] = letra
        index += 1
1 resposta

Olá Jefferson Luiz Oliveira de Campos,

No Python as listas são passadas por referencia por conta disso ocorre a mudança do index da lista ao invés de ser um parâmetro independente. Esse código pode lhe ajudar a entender o que estou querendo dizer. Veja que o primeiro registro vai ser alterado para 7 sem que eu precise retornar o valor para a função init()

def init():
    lista = [0, 1, 2, 3, 4]
    insert_into_list(lista)
    print(lista)


def insert_into_list(lista: list):
    size = len(lista)
    lista[0] = 2 + len(lista)


if (__name__ == "__main__"):
    init()