[Python] Scope

2806 단어 TILpythonTIL

Scope는 범위라는 뜻이다.

프로그래밍 언어에서는 어떠한 객체(변수,함수 등)가 유효한 범위를 이야기 한다.
범위를 벗어나면 해당 객체는 사용될 수 없다.
Python에서 scope은 항상 객체가 선언된 지점에서 위로는 상위 객체 까지, 아래로는 모든
하위 객체들과 그 안에까지가 범위이다.

Scope 범위에는 크게 다음 4가지가 있다.
1. Local Scope
2. Enclosed Scope
3. Global Scope
4. Built-in Scope

Local Scope이 가장 범위가 제한적이고 built-in scope이 가장 범위가 광범위하다.


Local Scope

local scope을 가지고 있는 변수나 함수 혹은 객체는 이름 그대로 특정 범위에서만 유효하다.
주로 함수 안에서 선언된 변수나 함수가 local scope을 가지고 있다. 그리고 이러한 변수들은
해당 함수 안에서만 유효하다.

def func():
	a = 1 # 함수안에서 선언됬음으로 해당 함수안에서만 유효한 변수
    print(a) #정상출력
#
print(a) #함수밖에서 해당 변수를 찾을 수 없어 에러 발생

Enclosing Scope

Enclosing Scope는 중첩함수가 있을 때 적용되는 Scope이다.
부모 함수에서 선언된 변수는 중첩함수 안에서도 유효한 범위를 가진다.

def outer():
	a = 1
    print(a)
    def inner():
    	b = 7
        print(a + b)# 부모 함수 안에서 선언된 변수(a) 사용가능
    inner()
    print(b) inner함수에서 선언된 b는 사용할수 없다. 에러발생

Global Scope

Global scope은 함수 안에서 선언된것이 아닌 함수 밖에서 선언된 변수나 함수를 이야기한다.
변수나 함수는 선언된 지점과 동일한 level의 지역, 그리고 더 안쪽의 지역들까지 범위가 유효하다.
그리고 global scope을 가지고 있는 변수와 함수들은 선언된 지점이 해당 파일에서 가장 바깥쪽에서 선언되므로 해당 파일에서 선언된 지점 아래로는 다 유효한 범위를 가지고 있다.

k = 9 #함수 밖에서 변수 선언
def outer():
	a = 1
    print(a + k) #함수밖에서 선언된 Global Scope이므로 k 사용가능
    def inner():
    	b = 7
        print(a * b * k) #k와 a 둘다 사용가능
    inner()
print(k)

Built-in Scope

Built scope은 scope중 가장 광범위한 scope 이다.
파이썬안에 내장되어 있는, 파이썬이 제공하는 함수 또는 속성들이 built-in scope를 가지고 있다. 그리고 built-in scope는 따로 선언이 없어도 모든 파이썬 파일에서 유효한 범위를 가지고 있다. 예를 들어, list등과 같은 자료구조의 element 총 개수를 리턴하는 len 함수가 바로
built-in scope를 가지고 있다.


shadowing

파이썬은 변수나 함수의 정의를 찾을 때 다음 순서의 scope들 안에서 찾는다.
Local => Enclosing => Global => built-in
즉 가장 좁은 유효범위 부터 시작해서 넓은 범위로 나아가며 사용되는 변수나 함수의 정의를 찾는다.
그러므로 만일 동일한 이름의 변수들이 서로 다른 scope에서 선언이 되면 더 좁은 범위에 있는
변수(혹은 함수)가 더 넓은 범위에 있는 변수를 가리는(shadowing) 효과가 나타난다.


Assignment

scope_test 함수에 parameter값에 상관 없이 무조건 63이 return 되도록 수정해라.

다음 예시와 같이 되어야 한다.

scope_test(10) == 63
scope_test(20) == 63
scope_test(333) == 63

what_is_my_scope = 7 # global scope 선언
def scope_test(what_is_my_scope2):
    some_number = 9 # 함수 내부 선언 
    def inner_scope(what_is_my_scope3):
        return what_is_my_scope * some_number
    return inner_scope(what_is_my_scope2)

좋은 웹페이지 즐겨찾기