[python] 문자열을 변수명으로 받을 수 있나요?

조회수 7798회

현재 구현중인 코드에서 리스트안에 문자형태(string type)로 값을 저장해주고 for문과 globals를 사용하여 해당 문자들을 변수명으로 사용함으로써 동적 변수를 설정하도록 구성하였습니다.

하지만 결과적으로 리스트 내부의 값들은 문자열이기 때문에 동적변수를 직접 호출할 방법이 없네요 혹시 해당 문제에 대한 해결방법이 없을까요?

아래코드는 설명의 이해를 돕기위해 간략하게 표현한 형태입니다.

path_list = ['a', 'b', 'c'] 
#list내에 동적 변수명으로 사용할 값들을 문자열로 선언

"""
중간 과정 생략 :

for문을 활용하여 path_list의 요소를 변수명으로 사용하여 값을 할당
결과적으로  a = [1,2],  b = [1,3,4],  c = [5,6] 형태로 데이터 할당됨

"""

for path in path_list :
     print(len(path))

"""
원하는 결과 : 2 3 2
실제 결과 : 1 1 1

해당 결과의 원인으로는 for문을 통해 받은 path_list 값이 
문자열 "a", "b", "c"이기 때문에 변수 a, b, c를 호출하지 못하는 상태입니다.

임시 방편으로 path_list2 = [a,b,c]와 같은 형태로 처리할 수 있지만
추후 path_list가 변수명을 추가로 할당 받게 되면 해당 변수들을
호출할 수 없다는 문제가 발생하여 근본적인 해결방안이 필요합니다.
"""
  • (•́ ✖ •̀)
    알 수 없는 사용자
  • eval 함수를 사용하시는 것이 방법이라면 방법입니다. dbwodlf3 2020.10.25 16:29

2 답변

  • 코드 안의 변수명을 동적으로 만드는 것, 아주 바보같은 짓입니다. 만들어도 쓰기가 어려워요.

    "변수명을 동적으로 만들고 싶다"는 생각이 들었다면, 뭔가 잘못 생각하고 있구나라고 생각하고 다른 방법을 생각해야 해요. 이런 질문들에 locals, globals 로 할 수 있는 방법을 알려주는 답변도 않좋다고 생각해요.

  • a = ['q','w','e']
    q = [1,2,3]
    w = [4,5,6,9,1]
    e = [7,8,9,5,2,6,7]
    
    for i in a:
        print(len(locals()[i]))
    
    #result
    #3
    #5
    #7
    

    eval 을 통해서 하는 방법이 있긴 한데 취약해서 위 내용 참고하여서 진행하시면 될거 같습니다 globals()

    근데 근본적으로 해당 문제는 딕셔너리 사용하면 위 고민을 할 필요가 없어보이긴 하네용

    수정) 딕셔너리로 하는게 아무리 봐도 좋아보여용 아래 코드 참고해주세요 원하시는게 아니라면 ...ㅎㅎ;;

    var_list = ['hi1', 'hi2', 'hi3']
    var_dict = {}
    
    def n_print(var_list):
        for i in var_list:
            print(var_dict[i])
    
    def n_input(var_list):
        for i in var_list:
            try:
                if var_dict[i] is None:
                    pass
            except:
                var_dict[i] = input('%s > '%i)
    
    def main():
        n_input(var_list)
        n_print(var_list)
    
        #case when variable add
        var_list.append('hi4')
    
        n_input(var_list)
        n_print(var_list)
    
    if __name__ == '__main__':
        main()
    
    
    • 제 답변 누구를 지칭해서 비판하려 한 것 아닙니다. 이런 유사한 질문을 많이 봤었고, 유사한 답변들을 많이 봤었는데, 아무래도 초보들에게 잘못된 길을 가르쳐주는 것 같아서 제 생각을 쓴 것입니다. nowp 2020.10.25 19:59

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)