Gidhub BE Developer

인자 전달, 스코핑 룰

2018-01-30
goodGid

인자 전달

  • 호출자가 전달하는 변수가 변경 가능한 변수 / 변경 불가능한 변수일 때 내부에서 처리하는 방식이 다르다.
>>> 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에서 에러가 발생한다.

Recommend

Index