Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Ponteiros em python

Porque a variável letras_acertadas é alterada na função marca_chute_correto quando passada como parâmetro? Porque a função vazia chamando a variável da erro mesmo sendo chamada dentro do escopo(while) da variável palavras_acertada?

Se eu passei um parâmetro com o mesmo nome de uma variável para uma função, eu não estaria criando uma nova variável com o mesmo nome válida apenas no escopo na função que é diferente da variável que está fora da função que tem o mesmo nome? Existem ponteiros em Python como os da linguagem C? Como é que essa variável passada como parâmetro age para ser alterada por uma função?

Meu código está igual com exceção da atribuição a letras_acertadas que não fiz uma função e já passei direto, segue o código, ele não da erro nenhum, quero apenas entender melhor seu funcionamento:

from random import randrange

def jogar():
    imprime_mensagem_abertura()
    palavra_secreta = carrega_palavra_secreta()

    letras_acertadas = ['_' for letra in palavra_secreta]#Modo de usar o for em apenas uma linha, LIST COMPREHENSIONS!!
    print(letras_acertadas)

    enforcou = False
    acertou = False
    erros = 0

    while(not enforcou and not acertou):
        chute = pede_chute()
        print(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)

def imprime_mensagem_abertura():
    print('*********************************')
    print('***Bem vindo ao jogo da Forca!***')
    print('*********************************')

def carrega_palavra_secreta():

    palavras = []
    with open("palavras.txt", "r", encoding="UTF-8") as arquivo:#with é usado para abrir arquivos e deixar o python
        for linha in arquivo:                                   #responsavel por fecha-lo automaticamente caso dê erro no programa
            linha = linha.strip()                               #Pesquisar mais sobre with e a função open()
            palavras.append(linha)

    print(palavras)

    palavra_secreta = palavras[randrange(len(palavras))].upper()
    arquivo.close()
    return palavra_secreta


def pede_chute():
    chute = input('Qual letra? ').upper().strip()
    return chute

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 imprime_mensagem_vencedor():
    #OMITIDO
    pass

def imprime_mensagem_perdedor(palavra_secreta):
    #OMITIDO
    pass
def desenha_forca(erros):
    #OMITIDO
    pass
1 resposta
solução!

Olá Nicholas, segundo a resposta de Ivbarbosa no seguinte link: http://www.guj.com.br/t/funcao-de-python-altera-variavel-fora-de-seu-escopo/343819

Listas são passadas por referência para argumentos. Quando você altera uma lista dentro de uma função, todas as variáveis que tem uma referência àquela lista veem as mudanças, independente do escopo. O que importa é a referência!

Se não estou enganado, não existe o conceito explícito de ponteiros em Python, assim como em C por exemplo. A linguagem Python trata alguns tipos de variáveis como 'ponteiros' implicitamente.

Ou seja, os tipos primitivos (e.g. int, float) são passados por valor (ou melhor, passa uma cópia da variável). Já para outros tipos (e.g. list, dict) o Python utiliza o endereço do objeto, portanto passa o endereço para a função e, neste caso, a função irá alterar o conteúdo do objeto referenciado pelo endereço.

Isso facilita a nossa vida como programadores e otimiza bastante o consumo de memória, porém temos que tomar cuidado para não alterar valores da lista (ou outro objeto) fora do 'escopo' desejado, principalmente para aqueles programadores que vem de outras linguagens como C e C++.

Abraço