๐Ÿ“’ Today I Learn/๐Ÿ‘พ Error

[Python] UnboundLocalError: local variable referenced before assignment

ny:D 2024. 5. 10. 15:10

240510 Today I Learn

๐Ÿ‘พ UnboundLocalError: local variable referenced before assignment
ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜(Global Variable)๋ฅผ ํ•จ์ˆ˜ ๋‚ด(Local Variable)์—์„œ ์‚ฌ์šฉ/๋ณ€๊ฒฝ ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ

๋ฌธ์ œ์ƒํ™ฉ

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

def solution(answers):
    tf={}
    answer = {'1':cnt1, '2':cnt2, '3':cnt3}
    math = {'1' :[1,2,3,4,5],'2':[2,1,2,3,2,4,2,5], '3':[3,3,1,1,2,2,4,4,5,5]}
    for key, values in math.items():
        i, j = divmod(len(answers),len(values))
        tf[key] = (values*i+values[:j])
    
    for key, values in tf.items():
        if key == '1':
            for i, j in zip(values,answers):
                if i == j:
                    cnt1+=1
        elif key == '2':
            for i, j in zip(values,answers):
                if i == j:
                    cnt2+=1
        else:
            for i, j in zip(values,answers):
                if i == j:
                    cnt3+=1
    answer = max(answer, key = answer.get)
    return answer

๐Ÿ” ์—๋Ÿฌํƒ์ƒ‰

Unbound Local Error๋Š” ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค.

x = 1
def func():
    x +=1
    print(x)

func()

์œ„์˜ ๊ฒฝ์šฐ x๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์ง€์ •ํ–ˆ๋Š”๋ฐ ์ด ๋•Œ `x=1`์ด๋ผ๊ณ  ์ง€์ •๋œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ๋ณ€์ˆ˜(global variable)๊ฐ€ ๋œ๋‹ค. ํŒŒ์ด์ฌ์€ ์ฝ”๋“œ ์ž‘์„ฑ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ตฌ๋™ํ•ด x=1์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋„ ์ ์šฉ๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜ `x`๋Š” ์ด๋ฆ„์ด ๊ฐ™์„ ๋ฟ ์ง€์—ญ๋ณ€์ˆ˜(local variable)๋กœ ๋ณ„๊ฐœ์˜ ๋ณ€์ˆ˜์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— x๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์ฑ„ ๋ฌด์ž‘์ • 1์„ ๋”ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ 'cannot access local variable 'x' ๋กœ์ปฌ๋ณ€์ˆ˜ 'x'์— ์—‘์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.'์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋Š” ๊ฒƒ์ด๋‹ค. 

 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์˜ ๋ฐฉ๋ฒ•๋“ค์„ ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

1. `x=1`์„ ํ•จ์ˆ˜ ์•ˆ์— ๋„ฃ์–ด์ฃผ๊ธฐ

def func():
    x = 1
    x += 1
    print(x)

func()
## 2

 

 

๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ local variable๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด ์žˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ์ „์—ญ๋ณ€์ˆ˜์˜€๋˜ x=1์„ ๋‹จ์ˆœํ•˜๊ฒŒ ํ•จ์ˆ˜ ์•ˆ์— ๋„ฃ์–ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด, ๋˜๋Š” x=0์ด๋ผ๊ณ  ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ์„ ํ•ด์ฃผ๊ธฐ๋งŒ ํ•œ๋‹ค๋ฉด, ์—๋Ÿฌ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค. 

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ๊ฒฝ์šฐ์—๋Š” ์ ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ ํ•จ์ˆ˜ ์™ธ๋ถ€์™€ ๋‚ด๋ถ€์—์„œ ํŠน์ • ๋ณ€์ˆ˜๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. (๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ๊ฐ™์„ ๋ฟ ๊ทผ๋ณธ์ ์œผ๋กœ๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ƒ๊น€์ƒˆ๋Š” ๊ฐ™์ง€๋งŒ ์™„์ „ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์ผ ์ˆ˜ ์žˆ๋Š” ๋„ํ”Œ๊ฐฑ์–ด์™€ ๊ฐ™๋‹ค.) ๋”ฐ๋ผ์„œ ์กฐ๊ธˆ ๋” ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ๋ฒ•์œผ๋กœ๋Š” ๋ฐฉ๋ฒ• 2๋ฅผ ์ถ”์ฒœํ•œ๋‹ค.

2. global variable ์ง€์ •ํ•˜๊ธฐ

x = 1
def func():
    global x
    x += 1
    print(x)

func()
## 2

์ด๋ ‡๊ฒŒ ํ•จ์ˆ˜ ๋‚ด์—์„œ `global x`์™€ ๊ฐ™์ด ์ „์—ญ ๋ณ€์ˆ˜ ์„ ์–ธ์„ ํ•ด์ฃผ๋ฉด, ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์„ ์–ธ๋œ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์—๋Ÿฌ ์—ญ์‹œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ•ต๏ธ‍โ™€๏ธ ๋ฌธ์ œํ•ด๊ฒฐ

๋‹ค์‹œ ๋งํ•ด, UnboundLocalError๋Š” ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜๋ฅผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ณ„๋„์˜ ์„ ์–ธ ์—†์ด ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‚˜์˜ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•œ ๊ฐ€์žฅ ํฐ ๋ณ€์ˆ˜๋Š”  `answer = {'1':cnt1, '2':cnt2, '3':cnt3}`๋‚ด๋ถ€์—์„œ ๋ณ„๋„์˜ ์„ ์–ธ ์—†์ด ์‚ฌ์šฉ๋œ cnt1, cnt2, cnt3์˜€๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ํ•จ์ˆ˜ ๋‚ด์— cnt1, cnt2, cnt3 ์„ธ ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์„ ์–ธํ•ด์ฃผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

def solution(answers):
    tf={}
    cnt1 = 0
    cnt2 = 0
    cnt3 = 0
    answer = {'1':cnt1, '2':cnt2, '3':cnt3}
    math = {'1' :[1,2,3,4,5],'2':[2,1,2,3,2,4,2,5], '3':[3,3,1,1,2,2,4,4,5,5]}
    for key, values in math.items():
        i, j = divmod(len(answers),len(values))
        tf[key] = (values*i+values[:j])
    
    for key, values in tf.items():
        if key == '1':
            for i, j in zip(values,answers):
                if i == j:
                    cnt1+=1
        elif key == '2':
            for i, j in zip(values,answers):
                if i == j:
                    cnt2+=1
        else:
            for i, j in zip(values,answers):
                if i == j:
                    cnt3+=1
    answer = max(answer, key = answer.get)
    return answer

๋‚˜์˜ ๊ฒฝ์šฐ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ํ…Œ์ŠคํŠธ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ๋‹ค๋Š” ์ ์—์„œ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ ์ƒํ™ฉ๋“ค๊ณผ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต์—์„œ๋Š” ๋ณดํ†ต ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค. '์•Œ๊ณ ๋ฆฌ์ฆ˜'์œผ๋กœ์„œ ๊ธฐ๋Šฅํ•  ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ตœ์ข… ๋ชฉํ‘œ์ธ๋ฐ, ๋‚˜์˜ ๊ฒฝ์šฐ vscode๋กœ 'ํ•จ์ˆ˜'๊ฐ€ ์•„๋‹Œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธ€๋กœ๋ฒŒ/๋กœ์ปฌ ์—๋Ÿฌ๋Š” ๋‚˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ.