ํผ๋๋ก ๋์๊ฐ๊ธฐ
Dev.toBackend
์๋ฌธ ์ฝ๊ธฐ
LEGB ๊ท์น ๊ธฐ๋ฐ์ Python Scope ์ ์ด๋ฅผ ํตํ ์ํ ๊ด๋ฆฌ ์ต์ ํ
๐ python global vs nonlocal keyword โ when to use each?
AI ์์ฝ
Context
Python์ ๊ธฐ๋ณธ ๋ณ์ ํ ๋น ๋ฉ์ปค๋์ฆ์ ํจ์ ๋ด ํ ๋น๋ฌธ์ Local Scope๋ก ์๋ ๋ฐ์ธ๋ฉํ๋ ๊ตฌ์กฐ์. ์ด๋ก ์ธํด ์ค์ฒฉ ํจ์ ๋ด์์ ์ธ๋ถ ์ค์ฝํ์ ๋ณ์๋ฅผ ์์ ํ๋ ค ํ ๋ UnboundLocalError๊ฐ ๋ฐ์ํ๋ ์ ์ฝ ์ฌํญ์ด ์กด์ฌํจ.
Technical Solution
- LEGB(Local $\to$ Enclosing $\to$ Global $\to$ Built-in) ์ฐ์ ์์ ๊ธฐ๋ฐ์ Name Resolution ํ๋ฆ ์ ์ฉ
- global ํค์๋๋ฅผ ํตํ Module-level Namespace ์ง์ ๋ฐ์ธ๋ฉ์ผ๋ก ํจ์ ๊ฐ ์ํ ๊ณต์ ๊ตฌ์กฐ ์ค๊ณ
- nonlocal ํค์๋๋ฅผ ํ์ฉํ์ฌ Enclosing Scope์ ๋ณ์๋ฅผ Cell Object๋ก ๋ํํ๊ณ Closure๋ฅผ ํตํ ์ํ ์ ์ง ๊ตฌํ
- ์ปดํ์ผ ํ์์ Symbol Table ์ค์บ์ ํตํด ํ ๋น ๋์์ Scope๋ฅผ ๋ช ์์ ์ผ๋ก ๊ฒฐ์ ํจ์ผ๋ก์จ ๋ฐํ์ ๋ฐ์ธ๋ฉ ๋ชจํธ์ฑ ์ ๊ฑฐ
- Cell Variables ๋ฉ์ปค๋์ฆ์ ํตํ ์ค์ฒฉ ํจ์ ๊ฐ ๋์ผ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ๊ณต์ ๋ก ๊ฒฝ๋ ์ํ ๋จธ์ ๊ตฌ์ถ
์ค์ฒ ํฌ์ธํธ
- ๋จ์ Read ์์ ๋ง ํ์ํ ๊ฒฝ์ฐ ํค์๋ ์์ด LEGB ๊ท์น ํ์ฉ - ๋ชจ๋ ์ ์ญ ์ํ(Debug Flag, Counter) ์์ ์ global ์ ์ธ - ๋ฐ์ฝ๋ ์ดํฐ๋ ํฉํ ๋ฆฌ ํจ์ ๋ด ์ํ ์ ์ง(Stateful Closure) ํ์ ์ nonlocal ์ ์ฉ - ๋ณต์กํ ์ํ ๊ด๋ฆฌ ์๊ตฌ ์ ํด๋์ค๋ ์ ๋๋ ์ดํฐ๋ก์ ์ ํ ๊ฒํ