수업진도 : chapter 1-1
오늘부터 인프런 파이썬 level3에 대해서 리뷰한다. 고고~~
#오늘의 학습내용은 variable scope이다.
우선 코드를 보면서 리뷰해보자.
a = 20
# 우리가 보통 변수를 선언하는 방식이다.
# 여기서 이러한 변수를 클래스 혹은 함수 외부에서 선언하면 해당 변수는 전역변수가 된다.
# 여기서 주의할 점이 있다.
# 예제 1
def my_love_py() :
a = 30
print(a)
위처럼 함수를 정의하고 my_love_py로 호출하면 전역변수의 값이 함수에 의해 변하여 30이 출력된다.
# 예제 2
a = 30
def my_py_py() :
a += 10
print(a)
위의 코드를 실행시키면 어떻게 될까??
변수할당에 에러가 발생한다. 그 이유는 변수 a가
이미 할당되어 있고 지역변수가 아니기 때문이다.
# 그래서 이러한 문제를 해결하기 위해
global a <= 이런식으로 변수 a가 전역변수임을 선언한다.
# 처음 개발 이후 수정되는 프로그램들의 특성상 전역변수를 중간에 값을 바꾸는 것은
# 코드를 예측하는 데 있어 방해가 될 수 있다.
# 중첩함수에서의 변수
def outer():
e = 70
def inner():
# 로컬 안에 또다른 로컬에서 지역변수를 수정하기 위해서.
nonlocal e
e += 10 # e = e + 10
print('Ex5 > ', e)
return inner
전역변수와 그것을 보는 함수 globals
만약에 우리가 어떤 파일에 다음과 같이 코드를 작성하고 print(globals())라고 출력하면 어떤 값이 나올까???
a = 20
def funk1() :
return 'print is fuck'
b = 30
def b_change(var) :
global b
b = b + var
return b
def first_func(args):
c = [x for x in args]
def second_func() :
nonlocal c
my_calculate = len(c) **2
print(my_calculate)
return second_func()
x = 20
print(globals())를 하면 아마 아래와 같은 사전형태의 결과물을 볼 수 있다.
{'__name__': '__main__', '__doc__': '\nChapter 1\nPython Advanced(1) - Python Variable Scope\nKeyword - scope, global, nonlocal, locals, globals..\n\n', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002670EB76CD0>, '__spec__': None, '__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>, '__file__': 'c:\\Users\\ddusa\\OneDrive\\바
탕 화면\\coding\\python practice(high)\\수업자료\\예제파일\\py_ad_1_1.py', '__cached__': None, 'a': 10,
'foo': <function foo at 0x000002670F0AB3A0>, 'b': 20, 'bar': <function bar at 0x000002670F0AB430>, 'c': 40, 'foobar': <function foobar at 0x000002670F0AB4C0>, 'd':
60,
'barfoo': <function barfoo at 0x000002670F0AB550>, 'outer': <function outer at 0x000002670F0AB5E0>, 'in_test': <function outer.<locals>.inner at 0x000002670F0AB670>, 'func': <function func at 0x000002670F0AB700>}
# 마지막으로 지역변수를 전역변수로 추가하고 싶다면 어떻게 할까?????
# 예시 3.
for i in range(1, 10) :
for k in range(1,10) :
globals()['{i} * {k}] = i * k
print(1*1) = 1