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
반응형