Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Por que o marcarchute correto consegue manipular letras acertadas ?

Fazendo a leitura do código, parece que a variavel letras_acertadas esta em diferente escopo entre os métodos.. fiquei um pouco confuso de como ele consegue atualizar o valor se não há um retorno/interação com o método que faz a chamada

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

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 enforcou and not acertou):

        chute = pede_chute()

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

        enforcou = erros == 7
        acertou = "_" not in letras_acertadas

        print(letras_acertadas)

    if(acertou):
        imprime_mensagem_vencedor()
    else:
        imprime_mensagem_perdedor(palavra_secreta)
4 respostas

Oi Everton, beleza?

Seguinte a função marca chute realmente não faz retorno, ela altera o próprio parâmetro que é passado para ela.

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

no caso letras_acertadas é segundo parâmetro da função e ele mesmo é alterado dentro do if.

Neste exemplo que vc colocou, a função jogar tem uma variável interna que também se chama letras_acertadas e ela está sendo passada para o parâmetro da função marca_chute_correto de mesmo nome, por isso ele consegue atualizar o valor.

Mas poderia ser qualquer coisa no nome da variável, se ele fosse passado como segundo parâmetro para a função marca_chute_correto o seu valor seria alterado.

Seria essa a dúvida?

Ficou um pouco confuso... por que esse código abaixo não imprime 11 duas vezes ?

é um cenário bastante similar, talvez o mesmo.. eu faço alteração diretamente no parametro mas a alteração não sensibiliza o valor da variavel que está no escopo inicial

def comeco():
    valor =10
    adiciona(valor)
    print(valor)
def adiciona(valor):
    valor = valor+1
    print(valor)

if (__name__ == "__main__"):
    comeco()
solução!

Oi Everton, entendi mais do seu argumento agora.

Então, nesse caso seu cenário é mais parecido com este:

def comeco():
    valor = ["1", "2", "3"]
    adiciona(valor)
    print(valor)

def adiciona(valor):
    valor[2] = "4"
    print(valor)

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

cuja saida é : ['1', '2', '4'] ['1', '2', '4']

Nesse caso o tipo da variável importa no comportamento da função.

Recomendo a leitura deste artigo caso vc se interesse mais sobre o tema de tipos de dados e seu comportamento dentro das funções. https://www.dataquest.io/blog/tutorial-functions-modify-lists-dictionaries-python/

Realmente com esse artigo fez mais sentido o comportamento, muito obrigado pela ajuda João :D