일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- react
- 알고리즘 연습
- 파이썬 알고리즘
- 알고리즘 풀이
- django rest framework
- Algorithm
- 장고
- 백준
- es6
- form
- Baekjoon
- javascript
- Django
- HTML
- Git
- CSS
- PYTHON
- js
- 알고리즘
- web
- API
- java
- c++
- 파이썬
- MAC
- AWS
- DRF
- 알고리즘 문제
- django widget
- django ORM
- Today
- Total
수학과의 좌충우돌 프로그래밍
Scoping , LEGB 룰 본문
안녕하세요 강민성입니다.
오늘은 파이썬 변수의 유효 범위에 대해서 알아보도록 하겠습니다.
먼저 scoping rule 이란
변수의 접근이 가능한 범위를 뜻합니다.
이 scope를 결정하는 방식에는 크게 두 가지로 나눌 수 있는데
static scoping 과 dynamic scoping 입니다.
그 중에서 dynamic scoping 에 대해서 알아보도록 하겠습니다.
dynamiic scoping를 사용하는 대표적인 예가 바로 python 이죠.
그래서 python 언어를 통해 알아보겠습니다.
파이썬에서 변수는 4가지 경우가 존재합니다.
LEGB 가 각각에 해당되는데 이에 대해서 먼저 알아보도록 하겠습니다.
Local : 함수 내부의 공간
Enclosing Function Local : 함수를 내포하는 또 다른 함수의 공간
Global : 함수 외부의 공간
Built-in : 내장영역
파이썬에서는 변수를 호출 할 때 찾는 위치가
다음과 같은 순서로 호출을 하게 됩니다.
local 을 확인해보고 없으면 그 다음 영역을,
또 없으면 그 다음 영역을 찾는 방식으로 말이죠.
이제 아래 예시를 통해 살펴보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | x = 10 y = 20 def outer(): x = 11 def inner(): z = 30 print(x,y,z) inner() x = 40 inner() outer() # 11 20 30 # 40 20 30 | cs |
첫 번째 inner 가 호출 될 때 부터 보겠습니다.
함수 내부에서 변수를 선언하면 자동으로 local 변수가 됩니다.
따라서 inner 의 입장에서는 선언된 local 변수는 z 하나 뿐입니다.
x는 local 변수로 선언이 안되있으므로
E 영역의 변수를 찾습니다.
여기서 x = 11 로 선언이 되있으므로 11을 출력하게 됩니다.
y 도 같은 방식으로 찾아보면
l 영역에 없고, E 영역에 없고 G영역, 즉 함수 바깥에 위치하고 있습니다.
따라서 20을 출력하게 됩니다.
z는 inner 함수 안인 l 영역에 선언이 되있으므로 바로 30을 출력하게 되죠.
두 번째 inner 에 대해서는 결과값은 알려드렸으니
어떻게 다음과 같이 출력되는지는 여러분께 과제로 남겨드리겠습니다.
다음 예시 입니다.
1 2 3 4 5 6 7 8 9 10 | x = 10 def test(y): x = y + 10 y = 10 test(y) print(x) # 10 | cs |
다음과 같이 x 값에 10을 더해주는 함수를 만들고 싶었지만
결과는 원래는 x값이 출력되고 맙니다.
x가 출력되는 시점에서 맨 위에 선언된
local 변수 x를 참조하기 때문이죠.
이 때 test 함수 내에서 x를 global 변수로 만들어 줄 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 | x = 10 def test(y): global x x = y + 10 y = 10 test(y) print(x) # 20 | cs |
다음과 같이
global 변수이름
형태로 변수를 선언하게 되면 함수 내에 있지만 local 변수가 아닌
global 변수가 되서 원하는 결과 값이 나오는 걸 확인할 수 있습니다.
마무리
코드가 길어질 수록 함수가 많아지고 복잡 해질수록
변수의 접근가능 범위를 찾는게 어려워 질 것입니다.
지금 제시한 예제들은 쉬운 예시들이지만
여러 코드를 보며 반복숙달해서
성장하시기를 바랍니다.
오늘도 글을 읽어주셔서 감사합니다 :)
'프로그래밍 언어 > Python' 카테고리의 다른 글
python map() 함수에 대해 알아보자! (0) | 2019.01.01 |
---|---|
문자열 함수 find와 index (2) | 2018.12.30 |
클래스와 인스턴스란? (3) 메소드 (0) | 2018.12.01 |
클래스와 인스턴스란? (2) 모델링 (0) | 2018.11.30 |
클래스와 인스턴스란? (1) (0) | 2018.11.30 |