global(전역변수)

Global Scope는 함수 안에서 선언된 것이 아닌, 함수 밖에서 선언된 변수나 함수를 말한다

global scope를 가지고 있는 변수와 함수들은 선언된 지점이 해당 파일에서 가장 바깥쪽에서 선언되므로 해당 파일에서 선언된 지점 아래로는 다 유효한 범위를 가지고 있다.

n = 1

def func():
	print(n) #error
	n = n + 1 # error
func()

전역함수라도 scope 밖에서 선언한 변수라면 읽을 수는 있지만 수정은 불가능하다

UnboundLocalError: local variable 'n' referenced before assignment 발생

지역변수내에서 print로 전역변수를 찍을때 위처럼 지역변수가 지정되어 있으면 함수 내 지역변수를 먼저 찾는다.

n = 1

def func1():
	def func2():
		global n
		n = n + 1
		print(n)  #2
	func2()
func1()

위 처럼 global로 지정을 해주면 수정이 가능하다

def func1():
	n = 1
	def func2():
		global n
		n = n + 1
		print(n)  #error
	func2()
func1()


NameError: name 'n' is not defined

위 내용은 전역 변수가 없는데 전역변수를 지정해주기 때문에 에러가 발생하게 됩니다.
이 부분은 non-local

local(지역변수)

Local Scope는 가지고 있는 변수나 함수 혹은 객체는 이름 그대로 특정 범위 안에서만 유효합니다.

주로 함수 안에서 선언된 변수나 함수가 local scope를 가지고 있다. 이런 변수들은 해당 함수 안에서만 유효하다

def func():
	a = 1
	print(a) #1

print(a) #에러

non-local

def func1():
	n = 1
	def func2():
		nonlocal n
		n += 1
		print(n)  #2
	func2()
func1()

위처럼 scope내 변수도 아니고 전역변수도 아닐때는 nonlocal을 이용한다.
난 지금 지역 변수가 아닌 변수를 이용한다는 의미로 non-local을 이용한다고 한다.

scope shadowing

local- nonlocal- global - builtin

가장 좁은 유효범위부터 시작해, 가장 넓은 범위로 나아간다. 만약 동일한 이름의 변수들이 서로 다른 scope 안에서 선언이 돼도 더 좁은 범위에 있는 변수를 가리는 shadowing 효과가 나타난다.

n = 10

def func():
	n = 1
	print(n)
print(n) # 10 출력

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN