ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๐Ÿ python global vs nonlocal keyword โ€” when to use each?
Dev.toDev.to
Backend

LEGB ๊ทœ์น™ ๊ธฐ๋ฐ˜์˜ Python Scope ์ œ์–ด๋ฅผ ํ†ตํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์ตœ์ ํ™”

๐Ÿ python global vs nonlocal keyword โ€” when to use each?

Python-T Point2026๋…„ 5์›” 21์ผ10๋ถ„intermediate

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 ์ ์šฉ - ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ์š”๊ตฌ ์‹œ ํด๋ž˜์Šค๋‚˜ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ์˜ ์ „ํ™˜ ๊ฒ€ํ† 

์›๋ฌธ ์ฝ๊ธฐ