• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

파일인코딩프로그램 만들기에서 질문있습니다!

20.01.13 14:16 작성 조회수 125

1

import os

def search_dir(dirname):
    result_list=[]
    filenames=os.listdir(dirname)#인자에 있는 모든 파일, 디렉토리 리스트 가져옴

    for filename in filenames:
        full_path=os.path.join(dirname,filename)#경로를 병합하여 새경로 생성
        if os.path.isdir(full_path): #디렉토리이면 파일이 나올떄까지 재귀
           search_dir(full_path) #result_list.extend(search_dir(full_path))
        else#파일이면 리스트에 합침
            result_list.append(full_path)
    return result_list
path="c:\\python"
print(search_dir(path))
재귀함수 부분에서 어차피 리스트에 합쳐지는 순간은 else문이라고 생각해서
if os.path.isdir(full_path): 에
result.extend안하고 재귀만 돌려놓고
출력해보니 result_list에 아무것도 들어있지 않았습니다
디버깅해보니 재귀함수가 끝날때
else문에서 저장했던 요소가 return result_list할때 사라지는것을 발견했습니다
왜 이런결과가 발생하는지 잘 모르겠습니다

답변 1

답변을 작성해보세요.

1

result_list.extend(search_dir(full_path)) 

위 구문은 풀어서 쓰면

new_list = search_dir(full_path)

result_list.extend(new_list)

이렇게 되고 실제 이 부분이 재귀적으로 구동되게 되는 핵심 구간이 됩니다. search_dir 함수에서 구한 값을 new_list 변수에 담고 그걸 다시 현재 result_list에 확장해서 저장해라~ 라는 내용이며 search_dir 내부에서는 다시 search_dir 를 호출하기 때문에 몇번이고 반복해서 호출된 search_dir() 함수의 결과를 누적하기 위해 이렇게 사용했습니다. 이렇게 누적된 result_list 는 최초 호출된 지점으로 리턴 하게 됩니다.

result_list.extend(search_dir(full_path))  ==> search_dir(full_path)

이렇게 변경하셨는데 그렇게 되면 search_dir(full_path) 는 아무런 결과를 내놓지 못합니다. 결과를 리턴하면 받아주는 부분을 삭제하셨으니 결과 또한 사라지는게 맞습니다.

search_dir(full_path)

이 문장에는 그 어디에도 리스트를 받거나 넘겨주는 인자가 없이 되어있습니다. search_dir() 함수 내부에서 result_list는 지역변수 입니다. 지역변수는 함수가 종료되며 사라집니다. 

lists = search_dir(full_path)

search_dir() 함수 내부의 search_list 결과를 위처럼 외부 변수로 받아줘야 데이터가 사라지지 않습니다.