λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

python

[Python] nonlocal, global둜 λ³€μˆ˜μ˜ scope λ³€κ²½ν•˜κΈ° (νŒŒμ΄μ¬μ—μ„œ μ „μ—­λ³€μˆ˜ μ‚¬μš©ν•˜κΈ°)

πŸ‘€ λ‹€λ₯Έ scope에 μžˆλŠ” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ 문제

case 1. 더 넓은 λ²”μœ„μ— μžˆλŠ” λ³€μˆ˜ '읽기'λŠ” κ°€λŠ₯

  • μ•„λž˜μ™€ 같이 μ „μ—­λ³€μˆ˜λ‘œ n을 μ„ μ–Έν•˜κ³  이λ₯Ό ν•¨μˆ˜ λ‚΄μ—μ„œ 읽기만 ν•˜λŠ” 경우 μ—λŸ¬κ°€ λ‚˜μ§€ μ•ŠλŠ”λ‹€.
n = 0 
def func(): 
	print(n) # 0 
func()
  • μ•„λž˜μ™€ 같은 κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€μ΄λ‹€. μ „μ—­ λ³€μˆ˜λŠ” μ•„λ‹ˆκ³  func2λ₯Ό 감싸고 μžˆλŠ” func1μ—μ„œ μ„€μ •ν•œ λ³€μˆ˜μ§€λ§Œ func2 λ‚΄λΆ€μ—μ„œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.
def func1(): 
	n = 1 
    	def func2(): 
        	print(n) # 1 
    func2() 
func1()
  • μ΄λ ‡κ²Œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ 곳보닀 μ•ˆμͺ½μ— μœ„μΉ˜ν•œ ν•¨μˆ˜μ—μ„œλŠ” λ³€μˆ˜λ₯Ό 읽을 수 μžˆλ‹€.

case2. 더 넓은 λ²”μœ„μ— μžˆλŠ” λ³€μˆ˜ 'λ³€κ²½'은 λΆˆκ°€λŠ₯

n = 0 
def func(): 
	n += 1 # error 
	print(n) 
func()
def func1(): 
  n = 1 
  def func2(): 
  	n += 1 # error 
  	print(n) 
  func2() 
func1()
  • μœ„ 두 μ½”λ“œ λͺ¨λ‘ 싀행해보면 UnboundLocalError: local variable 'n' referenced before assignment μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
  • 더 넓은 λ²”μœ„μ— μžˆλŠ” λ³€μˆ˜λΌλ„, ν˜„μž¬ scope λ°–μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λΌλ©΄, νŽΈμ§‘ν•  수 μ—†λ‹€.

 

πŸ‘€ global

n = 1 
def func1(): 
  def func2(): 
    global n 
    n += 1 
    print(n) # 2 
  func2() 
func1()
  • n을 μ „μ—­λ³€μˆ˜λ‘œ μ„ μ–Έν•΄μ£Όκ³  ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ νŽΈμ§‘μ„ 원할 λ•Œ, 'λ‚˜λŠ” μ§€κΈˆ ν•¨μˆ˜ λ‚΄μ˜ n이 μ•„λ‹Œ μ „μ—­λ³€μˆ˜ n을 μ“Έκ±°μ•Ό'λΌλŠ” 의미둜 global n이라고 μ„ μ–Έν•΄μ£Όλ©΄ λ¬Έμ œμ—†μ΄ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

πŸ’₯ μ „μ—­ λ³€μˆ˜κ°€ μ•„λ‹Œ 경우

def func1(): 
  n = 1 
  def func2(): 
    global n 
    n += 1 
    print(n) # error
  func2() 
func1()
  • λ§Œμ•½ μœ„μ™€ 같이 μ „μ—­ λ³€μˆ˜ n이 μ•„λ‹Œ λ³€μˆ˜μ— global ν‚€μ›Œλ“œλ‘œ 지정해쀀닀면 NameError: name 'n' is not definedμ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
  • μ΄λŠ” μ „μ—­λ³€μˆ˜λ‘œ μ„ μ–Έλœ n이 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.
  • 이런 κ²½μš°λŠ” global이 μ•„λ‹Œ nonlocal ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€.

 

πŸ‘€ nonlocal

def func1(): 
  n = 1 
  def func2(): 
    nonlocal n 
    n += 1
    print(n) # 2 
  func2() 
func1()
  • μœ„μ™€ 같이 ν˜„μž¬μ˜ scopeλ‚΄μ˜ μ§€μ—­λ³€μˆ˜κ°€ μ•„λ‹ˆκ³ , μ „μ—­λ³€μˆ˜λ„ μ•„λ‹Œ λ³€μˆ˜ n을 μ‚¬μš©ν•  λ•ŒλŠ” nonlocalν‚€μ›Œλ“œλ₯Ό 써쀀닀.
  • 'λ‚˜λŠ” μ§€κΈˆ μ§€μ—­λ³€μˆ˜λŠ” μ•„λ‹Œ λ³€μˆ˜λ₯Ό μ‚¬μš©ν• κ±°μ•Ό'λΌλŠ” 의미둜 nonlocal n이라고 μ„€μ •ν•΄μ£Όλ©΄ λ¬Έμ œμ—†μ΄ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

 

λ°˜μ‘ν˜•

'python' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Python] 얕은 볡사가 μΌμ–΄λ‚˜λŠ” 경우  (0) 2021.04.17