파이썬 에러 목록

·2021년 1월 21일
0

Python

목록 보기
4/7

1. UnboundLocalError: local variable referenced before assignment

해석을 해보면 할당이 되기도 전에 지역 변수가 할당이 됐다!

나는 분명 count를 함수 전에 선언을 해뒀는데?? 왜 이런 일이 일어난 걸까?
전에는 괜찮았던 것 같은데?

이를 되짚어 보기 위해서 아래의 예제를 살펴보자

li = [1,2,3,4,5]

def ok():
	li.append(6)
ok()

def no():
	li+=[6]
no()

def ok2():
	a = li[0]
    return a
print(ok2())
> 1

이와 같이 코드를 짜고 실행을 시킨다면 아마 함수 no의 li+=[6] 부분에서 오류가 날 것이다.
내가 착각하고 있던 것은 li.append(6)은 실행이 된다는 것이다.

여기서 중요한 키워드는 할당이다

사실 파이썬에서 지역 네임스페이스에 해당 변수가 없을 경우 전역변수를 참조해서 처리한다 그렇기 때문에 ok2()에서는 오류 없이 정상적으로 돌아간 것이다. 그러나,
no에서와 같이 함수 내에서 할당이 이루어지는 순간 컴파일러는 이를 로컬 변수로 인식하여 처리할려 하는데 그러다보니 함수 내부에서 li라는 변수를 찾지 못하고 초기화되지 않은 변수를 할당하려 하기에 오류가 발생하는 것이다. (ok()에서는 할당을 하고 있지 않다 = append는 할당이 아니다?)
그렇다면 방법이 없는가? 그건 아니다.
바로 지역변수가 지역변수가 아니라는 것을 컴파일러에게 전해주면 되는 것이다.

이와 같이 global을 사용해서 말이다


공부를 하다 추가적으로 발생한 부분. 함수 내에서 가변값에 대한 변경은 적용되나 객체의 생성은 적용되지 않는다.


2. TypeError:...:expected str instance, int found

num=int("".join(sorted(N,reverse=True)))

join함수를 사용하다가 발생한 오류. 오류자체는 str 객체를 사용해야하는데 int가 있다. 라는 건데 왜 발생했냐 하니
list를 str로 변환하기위해 join함수를 사용할때, list의 모든 요소들은 문자여야 한다. 즉 list 값들이 int형이기 때문에 이와 같은 오류가 발생한 것이다. 그렇기 때문에 오류를 해결해줄려면 다음과 같이 수정해줘야 한다.

num="".join(sorted(N,reverse=True))
int(num)

3. RuntimeError:dictionary changed size during interation

for문을 통해 dictionary에 접근했는데 for문 내부에서 dictionary의 key에 대한 value들이 수정되고 그러면서 dictionary의 사이즈가 바뀌어서 그런 듯. 즉, for문을 돌리면서 내부에서 사이즈를 변경하면 안된다.

profile
세상은 너무나도 커

0개의 댓글