Web Developing/Python_coding_test

[coding_test] str은 지역변수 내에서만 수정 가능 ( list는 전역 가능)

Tashapark 2025. 5. 11. 12:07
728x90

- 어떤 경우에는 빈 시퀀스를 전역변수로 선언하고 어떤 경우로는 지역변수로 선언하는 것을  계속 헷갈렸다.

==> 드디어 이해했음!

 

문제)

pw = {4:'love', 8:'smile', 6:'kiss'}
res = " " 
def yoonHa(nums):
    for i in nums:
        i = int(i)
        res += pw[i] ## 자꾸 이 부분에서 에러가 떴음
    return res
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    print(yoonHa(nums))
  File "main.py", line 9, in yoonHa
    res += pw[i]
UnboundLocalError: local variable 'res' referenced before assignment

 

-> 이해가 안 가서 뭐가 문제지 하고 gpt에게 물어보니, 전역변수로 선언을 해서 수정을 할 수 없다고 하였다. 

 

정답)

pw = {4: 'love', 8: 'smile', 6: 'kiss'}

def yoonHa(nums):
    res = ""  # 함수 내부에서 초기화
    for i in nums:
        i = int(i)
        res += pw[i]
    return res

# 채점을 위한 코드입니다. 이를 수정하지 마세요!
nums = input()
print(yoonHa(nums))

 

-> 함수 내부에서 초기화하는 것으로 변경. 

 

 

Q. 리스트는 전역으로 수정했는데?? 

- 이 부분이 헷갈리는 이유여서 물어봤음.

 

 

- 다른 것들도 살펴보면 이러함. 

 

- global로 쓰는 방법도 있지만, 유지보수가 어려우니 함수 내에서만 사용하라고 했는데. 좀 모호했음.

✅ 왜 list.append()는 전역에서 되고, res += "a"는 안 될까?

  • list.append()는 전역 리스트 객체는 그대로 유지한 채 내부 내용만 수정하는 거예요.
    → 이건 함수 내에서 전역 변수 자체를 재할당하지 않으므로 허용됨.
  • 반대로 res += "a"는 문자열을 새로 만들어서 res에 할당하려는 거예요.
    → 파이썬은 이걸 지역 변수로 착각해서 에러를 내요.

 

- 위를 보면 이해가 좀 되는데, append()는 기존의 리스트에  추가만 하는 건데

   +=는 시쿼스를 매번 새로 만들어서 계속 할당하는 것이라서 다시 초기화하는 것으로 판단하는 것 같다. 

-> 그래서 안 되는 듯. 

728x90
반응형