Variáveis em python, elas perdem seus valores

Olá, (se quiser pule para a frase antes do código para descrição)
há algumas semanas tento fazer um programa em python que abre um arquivo de texto, lê e retorna palavras mais usadas. Posteriormente alterei o programa para receber uma string e fazer o previsto, mas tenho tido um grande problema. Eu debuguei com o Visual Community e verifiquei que todas as variáveis perdiam seus valores quando o programa entrava em sua primeira função. O erro que aparece no console leva a crer no mesmo.
Tive um problema parecido quando estava no início da minha aprendizagem com C++ e resolvi o problema duplicando a referencia à variável utilizando um ponteiro. Não sei se existe alguma função (em python) que retorne um ponteiro.
Acho que a perda de valor das variáveis é devido ao coletor de lixo (não estudei muito sobre o coletor de lixo em python).

Antes de mostrar o programa peço que alguém me ajude com a formatação de código.

# import os
#inicialização de variáveis
DIC = {} #dicionario onde ficaram as palavras
temp_char = ""
temp_palavra = ""
tam_palavra = 0
palavra = ""
lista = [] #lista que auxilia o dicionario
espaco = " "
pontuacao = [".", "!", ";", "?", ",", ":"] #pontuacao necessaria para nao confundir "os.getcwd()" com "os" "cwd()" que sao duas palavras diferentes
posicao = None
palavra_tam = 0
selec_palavra = None
end_file = False #fim do arquivo
#print (os.getcwd()) #imprime o diretorio atual
fo = open('Desktop/Texto.txt', "r")
#seleciona o proximo caracter

def next_char():
    print (tam_palavra)
    tam_palavra +=1
    temp_char = fo.read(1)
    if (temp_char == None):
        end_file = True
        pass
    temp_palavra += temp_char

#ve se eh <espaco> para terminar a palavra
def selec_palavra():
    if(temp_char == " "):
        selec_palavra = True
    elif(temp_char in pontuacao):
        next_char()
        if(temp_char == " "):
            selec_palavra = False
        else:
            selec_palavra = 0
    else:
        selec_palavra = 1

#nao tem uma finalidade muito util provavelmente vou retira-la
def escolha():
    if selec_palavra == True:
        fim_palavra()
        return True
    elif selec_palavra == False:
        fim_palavra()
        return True
    elif selec_palavra == 0: #A palavra não terminou
        return False

#procedimento ao terminar a palavra
def fim_palavra():
    palavra = temp_palavra
    temp_char = ""
    temp_palavra = ""
    fo.seek(1, -tam_palavra + 1)
    while(temp_char != " "):
        temp_palavra += temp_char
        temp_char = fo.read(1)
    if(temp_palavra != palavra):
        print (palavra+ " "+temp_palavra)

#funcao onde tem a estrutura principal do programa
def _init():
    while(not end_file):
        next_char()
        selec_palavra()
        if (not escolha()):
            next_char()
        if(palavra != " "):
            lista.append[palavra]
            palavra = ""
            temp_palavra = ""
            tam_palavra = 0
            temp_char = ""

    for item in lista:
        if (list[item] in DIC):
            DIC[lista[item]]+=1
        else:
            DIC[lista[item]]=1

    print (DIC)
    fo.close()
    raw_input("fim do programa \n")

#chama o laco principal
_init()

seu problema é utilizar essa quantidade insana de variaveis globais.

eu tentei e desisti de entender. se livre de boa parte delas e use variaveis locais.

Concordo com peczenyj.

Outra coisa, sempre que um código python começa ficar grande, desconfie.
Segue um código que pode resolver o seu problema.

import re
from collections import Counter

with open('ARQUIVO') as f:
    arquivo = f.read()

palavras = re.findall(r'\w+', arquivo)
palavras_upper = [palavra.upper() for palavra in palavras]
contagem_palavras = Counter(palavras_upper)

A contagem_palavras recebe um dict com a contagem de todas as palavras no arquivo.

Espero ter ajudado.

Obrigado a ambos pelas respostas.
Peczenyj, até então eu pensava que se as variáveis globais eram destruidas, nada impediria que o mesmo acontecesse com instâncias de objetos. Agora estou estudando a fundo a parte de classes (outra vez) para tentar melhorar minhas práticas de programação.

Flavio_Milan, este módulo é novidade para mim. Implementei esse código em C++ de maneira a ver que não precisava de tantas variáveis, como bem dito por peczenyj, e poderia reduzir todo o programa a uma função, apesar de ter sido um pouco mais complicado associar as Strings a suas contagens: uma nova classe foi necessária

Bixo

a questão não sobre a variavel ser ou nao destruida, é vc ter um codigo grande e confuso, de forma q toma tempo da gente colocar o olho e entender, por exemplo, o ciclo de vida das variaveis, o escopo ao qual elas pertencem, etc.

uma surpresa pra galera q começa a brincar com linguagens dinâmicas é que vc pode comer erros de digitação e ai vc tem duas variaveis de nome parecido e valores que vão te surpreender. ou reusar a variavel pra fazer duas coisas diferentes sem perceber. ai tem q praticar

Ta certo Lince, dê uma olhada sim pq variáveis em python são diferentes das variareis em C/C++. Quanto aos módulos, dê uma olhada na documentação oficial da linguagem, com certeza você vai encontrar funções prontas para seus problemas.

https://docs.python.org/3/tutorial/modules.html

Abraço