인자 전달
- 호출자가 전달하는 변수가 변경
가능한
변수 / 변경불가능한
변수일 때 내부에서 처리하는 방식이 다르다.
>>> def change(x):
... x[0] = 'H' # list x의 첫 번째 아이템을 'H'로 바꾼다.
>>> wordlist = ['J', 'A', 'M']
>>> change(wordlist)
>>> wordlist
['H', 'A', 'M'] # change가 호출자의 객체에게 영향을 미친다.
-
리스트
는 변경 가능한 변수 타입이기 때문에 위에 예와 같은 결과가 나타난다. -
만약 함수 내부에서 변경해도 호출자의 객체에 영향을 미치지 않게 하려면 다음과 같이 복사해서 사용해야 한다.
>>> def change(x):
... x = x[:] # 입력받은 인자를 모두 x에 복사한다.
... x[0] = 'H' # list x의 첫 번째 아이템을 'H'로 바꾼다.
... return None
>>> wordlist = ['J', 'A', 'M']
>>> change(wordlist)
>>> wordlist
['J', 'A', 'M'] # change가 호출자의 객체에게 영향을 미치지 않는다.
스코핑 룰
>>> x = 1
>>> def func(a):
... return a+x # 함수 내 지역 영역에 해당 이름이 없기 때문에 전역 영역에서 같은 이름을 찾아 사용한다.
>>> func(1)
2
>>> def func2(a):
... x=2 # 함수 내 지역 영역에 x라는 이름이 등록된다.
... return a+x
>>> func2(1)
3
-
이처럼 이름을 검색하는 규칙이 있는데
이름을 사용하면
지역(Local)
,전역(Global)
,내장(Built-in)
인 순서로 검색한다. -
이 규칙을 첫 글자를 따서
LGB 규칙
이라고 한다. -
만약 지역 영역에서 전역 영역의 변수를 사용하고 싶을 땐
global
선언문을 사용하면 된다.
>>> g = 1
>>> def Scope(a):
... global g
... g = 2
... return g+a
>>> Scope(1)
3
>>> g
2
>>
- 전역 영역에 변수
g
가 없을 경우global g
라는 Line에서 에러가 발생한다.