Scope

Jina·2020년 3월 30일
0

Today I Learned

목록 보기
6/21

variable

global

  • 전역변수
  • 어떤 영역에서도 접근할 수 있음
  • 함수 밖에서 정의된 변수
  • 사용을 최소화 하는 것이 좋음

local

  • 지역변수
  • 정해진 영역에서만 접근 가능
  • 함수 내에서 정의된 변수
  • 해당 함수 내에서만 사용할 수 있음

변수에 접근하기

예시 1) 전역변수는 어떤 영역에서도 접근 가능

x=100     
print(x)  
# 100
# 전역변수 x는 어떤 영역에서든 접근 가능

def func():
    print(x)

func()
# 100
# 전역변수 x는 어떤 영역에서든 접근 가능

x는 전역변수 --> 어느 영역에서나 접근 가능함
func()에 정의된 x라는 변수가 없으므로 global 변수인 x를 사용함


예시 2) 지역변수는 함수 내에서만 접근 가능

def func():
    y=1000
    print(y)
    
    
func()
# 1000
# 함수 내에서 y 변수에 접근 가능 

print(y)
# NameError: name 'y' is not defined
# 지역변수는 해당 함수 내에서만 접근 가능

여기서 y 변수는 func 함수 내에서 정의된 지역 변수
--> 따라서 func 함수 내에서만 접근 가능


예시 3 ) 지역변수와 전역변수가 같은 이름일 때

x=100

def func():
    x= 5000
    print(x)

func()
# 5000
# 함수 내에 있는 x를 print

print(x)
# 100
# global 변수인 x를 print

지역변수와 전역변수가 같은 이름일 때
함수 내에서는 지역변수를 우선적으로 사용

요약

  • 전역변수는 함수 내/ 함수 외의 어떤 영역에서도 접근이 가능함
  • 지역변수는 함수 내에서만 접근 가능
  • 지역변수와 전역변수가 같은 이름일 때 함수 내에서는 지역변수를 우선적으로 사용함

변수 수정하기

전역변수 수정

  • 함수 밖에서 전역변수 수정하기

아래의 예시처럼 함수 밖에서 전역변수 수정이 가능

x=10
x=x+1

print(x)
# 11
  • 함수 내에서 전역변수 수정하기

함수 내에서 전역변수에 접근하는 것이 가능함
그러나 아래의 예시처럼 함수 내에서 전역변수 수정은 불가능

x=10

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

func()
# UnboundLocalError: local variable 'x' referenced before assignment

그렇다면 전역변수를 수정해야할 때 사용할 수 있는 방법은? global 키워드 이용하기

global 키워드

함수 내에서 범위 밖에 있는 전역변수를 수정할 수 있게하는 키워드

사용방법 : global 변수명

x=10

def func():
	global x   # global keyword 사용
	x=x+1	   # 전역변수 수정됨
	print(x)


func()
# 11

print(x)
# 11

전역변수를 많이 사용하면 변수 사이에 충돌이 발생할 수 있는 등의 단점이 있음
따라서 전역변수 사용을 최소화 하는 것이 좋음
--> global 키워드 역시 사용을 최소화 하는 것이 좋음

지역변수 수정

지역변수는 함수 내에서 수정가능
함수 외부에서는 지역변수 이용 불가능 (이용 불가능해서 수정도 불가능)

요약

  • 전역변수는 함수 내에서 수정이 불가능함 (global 키워드를 쓰면 수정 가능)
  • 함수 내에서 전역변수를 수정하고 싶으면 global 키워드 이용
  • 지역변수는 함수 내에서 수정 가능

scope

어떠한 객체(변수, 함수 등)가 유효한 범위

  • Local Scope
  • Enclosed Scope (Nonlocal scope)
  • Global Scope
  • Built-in Scope

Local Scope

함수 내에서 선언된 변수가 가지고 있는 범위

  • 하늘색 부분 : 변수 y의 local scope
  • 회색 부분 : 전역변수인 x의 global scope

Nonlocal Scope

중첩함수가 있을 때 적용되는 범위
outer의 안에 있되 inner의 밖에 있는 영역

  • 회색 부분 : 변수 x의 global scope
  • 하늘색 부분 : inner 함수에 있는 변수 zlocal scope
  • 분홍색 부분 : outer 함수에 있는 변수 ylocal scope / Nonlocal scope

ex) outer 함수에 있는 변수 y는 inner 함수 입장에서는 nonlocal scope에 있는 변수


Global Scope

전역변수가 가지는 유효범위
전역변수가 선언된 지점 아래부터 global scope

위의 그림들 중 회색범위가 global scope


Built-in Scope

가장 광범위한 scope
파이썬 내장함수 또는 속성들이 built-in scope를 가지고 있음

built-in scope는 따로 선언이 없어도 모든 파이썬 파일에서 유효한 범위를 가지고 있음

ex) len( ), sum( ) 등 파이썬의 내장함수

Nonlocal keyword

  • inner 함수에서 nonlocal 범위에 있는 변수에 접근 가능

예시 1)

x=1

def outer():
    y=100    
    def inner():
        return y   # nonlocal 범위에 있는 변수에 접근
    return inner

func2=outer()
print(func2())   

# 100
  • inner 함수에서 nonlocal 범위에 있는 변수 수정 불가

예시 2 )

x=1

def outer():
    y=100    
    def inner():
        y=y+1   # nonlocal 범위의 변수 수정 불가능
        return y 
    return inner

func2=outer()
print(func2()) 

# UnboundLocalError: local variable 'y' referenced before assignment

nonlocal keyword

위의 예시 2를 보면 inner 함수에서 nonlocal 범위에 있는 변수는 수정이 불가능 했음
이를 수정하기 위해서 nonlocal keyword 이용

사용방법 : nonlocal 변수이름

x=1

def outer():
    y=100    
    def inner():
        nonlocal y  # nonlocal keyword 사용
        y=y+1
        return y
    return inner

func2=outer()
print(func2())

# 101

위와 같이 nonlocal keyword를 이용하면 nonlocal 범위에 있는 변수를 수정할 수 있음


ref) https://shoark7.github.io/programming/python/closure-in-python#2c

0개의 댓글