# g, h는 전역 변수
g = 10
h = 5
def f(a): # a는 지역 변수
h = a + 10 # h는 지역, 새로 l-value로 정의했음
b = h + a + g # b도 지역, g는 r-value이므로 기존 값을 참조 - 전역 변수 (2a + 10 + g)
return b
print(f(h)) # 함수 호출시에 사용되는 변수는 해당 위치의 스코프에서 값을 찾음 - 전역 변수
print(h) # 전역 변수 h는 변함 없음
30 5
global
키워드 활용h = 5
def f(a): # a는 지역
global h # h 변수를 전역이라고 미리 선언함
h = a + 10 # h는 l-value로 정의되더라도 미리 선언된 내용 때문에 전역 변수
return h
print(f(10))
print(h) # 전역 변수 h 값이 함수 내에서 변경되었음
20 20
g = 10
def f():
a = g # r-value로 사용되는 g는 전역 변수
g = 20 # l-value로 정의되는 g는 지역 변수
return a
print(f())
--------------------------------------------------------------------------- UnboundLocalError Traceback (most recent call last) <ipython-input-2-b9cfd4ba6eab> in <module> 6 return a 7 ----> 8 print(f()) <ipython-input-2-b9cfd4ba6eab> in f() 2 3 def f(): ----> 4 a = g # r-value로 사용되는 g는 전역 변수 5 g = 20 # l-value로 정의되는 g는 지역 변수 6 return a UnboundLocalError: local variable 'g' referenced before assignment
g = 10
def f():
global g # g는 전역 변수로 선언됨
a = g # a는 지역 변수, g는 전역 변수
g = 20 # g는 전역 변수
return a
print(f())
print(g)
10 20
dir()
: 함수가 호출된 스코프에서 정의되어 있는 모든 Name들을 문자열 리스트로 반환한다.dir(object)
: object이 지니고 있는 모든 Name들을 문자열 리스트로 반환한다.print(dir())
['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_ih', '_ii', '_iii', '_oh', 'exit', 'f', 'g', 'get_ipython', 'quit']
l = []
print(dir(l))
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
x = 2
def F():
x = 1
def G():
x = 20
print(x)
G()
F()
20
x = 2
def F():
x = 1
def G():
x = 20
print("G():", x)
G()
print("F():", x)
F()
print("Global:", x)
G(): 20 F(): 1 Global: 2
x = 2
def F():
x = 1
def G():
global x
x = 20
print("G():", x)
G()
print("F():", x)
F()
print("Global:", x)
G(): 20 F(): 1 Global: 20
math, string
.py
.py
는 바이트 코드로 컴파일 되어 .pyc
로 존재한다.# File: mymath.py
mypi = 3.14
def add(a, b):
return a + b
def area(r):
return mypi * r * r
.py
를 제외한 것import
import mymath
print(dir(mymath)) # mymath에 정의된 이름들 확인하기
print(mymath.mypi) # mymath 안에 정의된 mypi를 사용한다
print(mymath.area(5)) # mymath 안에 정의된 area를 사용한다
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add', 'area', 'mypi'] 3.14 78.5
dir(모듈)
: 모듈이 지니고 있는 모든 이름들을 리스트로 반환import string
print(dir(string))
['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
string
모듈 이름 공간에 변수 a
를 생성한다.import string
string.a = 1
print(string.a)
1
class C: # 클래스도 독립적인 이름 공간
a = 2 # 클래스 이름 공간 내에 변수 선언
pass # 클래스 정의 완료
c = C() # 클래스 인스턴스 객체 생성
c.a = 1 # 클래스에서 생성된 인스턴스 객체도 별도의 이름 공간
print(c.a)
print(c.__class__.a)
print(C.a)
1 2 2
x = 10 # 현재 모듈 내부에 정의되는 이름
def f():
a = 1
b = 2 # 현재 모듈에 정의되는 함수 f 내에 이름 a,b를 정의하고있다. 함수도 독립적인 이름 공간
f.c = 1
print(f.c)
print()
print(f.a)
1
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-19-4ccf5ee8b313> in <module> 6 print(f.c) 7 print() ----> 8 print(f.a) AttributeError: 'function' object has no attribute 'a'
print('a' in dir(f))
print('c' in dir(f))
False True
PYTHONPATH
환경 변수 설정하기¶파이썬이 모듈을 찾는 순서
pwd
명령으로 확인 가능)! pwd
PYTHONPATH
환경 변수에 기술된 디렉토리 목록을 차례로 탐색sys
모듈 임포트 후 sys.path
로 확인 가능sys.path.append()
, sys.path.remove()
로 추가, 삭제 가능PYTHONPATH
환경 변수 설정 방법
PYTHONPATH
, 변수 값 - C:\Users\yhhan\mypythonlib
~/.bashrc
, ~/.bash_profile
, 혹은 ~/.profile
파일에 다음 라인 추가export PYTHONPATH=/Users/yhhan/mypythonlib
source ~/.bash_profile
PYTHONPATH
설정import sys
print(sys.path)
['/Users/jubong/anaconda3/lib/python36.zip', '/Users/jubong/anaconda3/lib/python3.6', '/Users/jubong/anaconda3/lib/python3.6/lib-dynload', '', '/Users/jubong/anaconda3/lib/python3.6/site-packages', '/Users/jubong/anaconda3/lib/python3.6/site-packages/aeosa', '/Users/jubong/git/ml-agents/ml-agents', '/Users/jubong/git/ml-agents/gym-unity', '/Users/jubong/git/ml-agents/ml-agents-envs', '/Users/jubong/git/mujoco-py', '/Users/jubong/anaconda3/lib/python3.6/site-packages/IPython/extensions', '/Users/jubong/.ipython']
import sys
sys.path.append('~/mypythonlib')
print(sys.path)
['/Users/jubong/anaconda3/lib/python36.zip', '/Users/jubong/anaconda3/lib/python3.6', '/Users/jubong/anaconda3/lib/python3.6/lib-dynload', '', '/Users/jubong/anaconda3/lib/python3.6/site-packages', '/Users/jubong/anaconda3/lib/python3.6/site-packages/aeosa', '/Users/jubong/git/ml-agents/ml-agents', '/Users/jubong/git/ml-agents/gym-unity', '/Users/jubong/git/ml-agents/ml-agents-envs', '/Users/jubong/git/mujoco-py', '/Users/jubong/anaconda3/lib/python3.6/site-packages/IPython/extensions', '/Users/jubong/.ipython', '~/mypythonlib']
sys.path.insert(0, '~/mypythonlib2')
print(sys.path)
['~/mypythonlib2', '/Users/jubong/anaconda3/lib/python36.zip', '/Users/jubong/anaconda3/lib/python3.6', '/Users/jubong/anaconda3/lib/python3.6/lib-dynload', '', '/Users/jubong/anaconda3/lib/python3.6/site-packages', '/Users/jubong/anaconda3/lib/python3.6/site-packages/aeosa', '/Users/jubong/git/ml-agents/ml-agents', '/Users/jubong/git/ml-agents/gym-unity', '/Users/jubong/git/ml-agents/ml-agents-envs', '/Users/jubong/git/mujoco-py', '/Users/jubong/anaconda3/lib/python3.6/site-packages/IPython/extensions', '/Users/jubong/.ipython', '~/mypythonlib']
import sys
# sys.path.append('/Users/jubong/git/python-link-e-learning/python3.6/mymath')
sys.path.append('/Users/jubong/git/python-link-e-learning/')
참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일