Não consigo alterar a variável durante o laço while

3 respostas
python
A

O objetivo é navegar nas pastas através do modulo os
import os

def listArchives(url):
return os.listdir(url)

def showArchives(ArchivesList):
for enum,archive in enumerate(ArchivesList, start=1):
    print(f'{enum}-{archive}')

def selectArchives(ArchivesList, option,URL): 
for enum, archive in enumerate(ArchivesList, start=1):
    if option == enum:
        URL=os.path.join(URL, archive)
        ArchivesList = listArchives(URL)
        
URL = 'c:\\'
ArchivesList = os.listdir(URL)

while True:
    showArchives(os.listdir(URL))
    option = int(input('dir: '))
selectArchives(ArchivesList,option,URL)

o problema é que mesmo eu tentando alterar o valor URL e o ArchivesList, é como se eu estivesse reescrevendo a variável que recebi como argumento dentro da função, logo ela não existe fora dela, se eu tentar chamar ela sem passar como argumento ele não reconhece a variável.

3 Respostas

K

Então, se o seu código estiver exatamente igual o postado, acredito que é erro de formatação, um simples “TAB” com as ultimas 3 linhas selecionadas.
mude isso:

while True:
showArchives(os.listdir(URL))
option = int(input('dir: '))
selectArchives(ArchivesList,option,URL)

Para isso:

while True:
    showArchives(os.listdir(URL))
    option = int(input('dir: '))
    selectArchives(ArchivesList,option,URL)

como não tem chaves [’{’,’}’] para delimitar os blocos isto é feito por “TAB” ou seja, pra estar dentro do bloco do “WHILE” o codigo tem que estar a 1 tab depois dele.
Se vc colocar na mesma linha vertical é como se a próxima linha fosse executada fora do WHILE.

A

tlgd, o código original está formatado corretamente, é que isso ai é um ctrl+z. O problema era na hora de manipular as variáveis globais, ele simplesmente criava uma nova variavel com o mesmo nome. Solucionei clocando global nas variáveis que queria mudar.

H

Não acho uma boa usar variáveis globais, pois aí as funções ficam dependentes demais delas (leia mais sobre isso aqui). Eu sugiro fazer com que a função retorne o valor da variável atualizado, algo assim:

import os

def listArchives(url):
    return os.listdir(url)

def showArchives(arquivos):
    for enum, archive in enumerate(arquivos, start=1):
        print(f'{enum}-{archive}')

def selectArchives(arquivos, option, pasta_atual):
    # retorna a nova pasta
    return os.path.join(pasta_atual, arquivos[option])
        
pasta_atual = 'c:\\'
while True:
    arquivos = listArchives(pasta_atual)
    showArchives(arquivos)
    option = int(input('dir: '))
    pasta_atual = selectArchives(arquivos, option - 1, pasta_atual)

Também mudei os nomes de algumas variáveis, e veja que o selectArchives não precisa fazer um loop. Listas possuem índices numéricos que podem ser acessados diretamente, então basta acessá-lo.

Claro que tem algumas melhorias: se for digitada uma opção inválida (não é número, ou é um número que não existe - por exemplo, digitei “20” sendo que só tem 10 arquivos), ou se o usuário escolher um arquivo em vez de um diretório, dará erro. Mas aí já é outra história…

Criado 15 de novembro de 2020
Ultima resposta 17 de nov. de 2020
Respostas 3
Participantes 3