본문 바로가기
파이썬/주식 자동매매

Python 키움API 자동매매프로그램 개발-20.Python 기초편 함수(3)유효범위

by 행복론자 2021. 1. 29.

시리즈 이전글입니다.

2021/01/29 - [파이썬/주식 자동매매] - Python 키움API 자동매매프로그램 개발-19.Python 기초편 함수(2) Return 사용

 

 

앞서 배운 반환하기(return)가 필요했던 이유는 함수 자체의 영역과 함수를 호출하는 영역이 구분되어 있기 때문이었습니다. 그렇지 않고 모두 하나에 같은 영역에 있다면 return 없이도 변수를 공유할 수 있었을 것입니다.

하지만 아래 예시코드처럼 add 함수 내부에 정의된 result라는 변수는 add 함수가 호출되고 나서는 소멸해버리기 때문에 함수를 호출한 다음 출력하려고 하면 알 수 없는 값이 되어버립니다. 

def add(param1, param2):
  result = param1 + param2

add(1, 3)
print(result)

# NameError: name 'result' is not defined



함수 내부에서 사용하는 변수는 return 없이는 외부에서 사용할 수는 없습니다.

하지만 반대로 함수 내부에서는 호출하는 영역의 변수를 참조하여 사용할 수 있습니다.

result = 10
def add(param1, param2):
  print(param1 + param2 + result)

add(1, 3)  # 1 + 3 + 10, 14출력 

 

 

이렇게 단순히 변수를 선언하더라도 어느 영역에서 선언했느냐에 따라 사용할 수 있는 범위가 다릅니다. 

변수를 선언할 때 그 변수가 쓰일 수 있는 영역을 유효범위(Scope)라고 부릅니다.

 

다음처럼 add함수 내부라는 한정된 영역에서 사용하려고 만든 변수를

지역변수(Local Variable)라고 하며 변수를 선언한 유효범위 인 함수 내부에서만 사용할 수 있습니다. 따라서 함수 밖 영역에서는 지역변수 result가 어떤 값인지 알지 못하는 것입니다. 

def add(param1, param2):
  result = param1 + param2  # 함수 내부에서 선언한 result는 지역변수 

add(1, 3)
print(result)
# NameError: name 'result' is not defined

 

 

반대로 함수의 선언영역이 아닌 바깥 부분을 전역(Global Scope)라고 하며 전역에서 선언된 변수를 전역변수라고 합니다. 

전역변수로 선언된 변수는 함수 내부에서도 참조할 수 있습니다. 

result = 10  # result는 전역변수  
def add(param1, param2):
  print(param1 + param2 + result)

add(1, 3)  # 1 + 3 + 10, 14출력 

 

 

그러면 다음처럼 동일한 이름의 변수를 사용한 경우, add 함수의 결과는 어떻게 될까요?

result = 10  # 전역변수 result
def add(param1, param2):

   result = 100 
  print(param1 + param2 + result)

add(1, 3)

 

 

함수 내부에 선언된 지역변수 result가 우선순위를 갖기에 실행 결과는 1+3+100이 됩니다.

변수를 사용할 때 가장 가까이 정의되어 있는 변수를 조회한다고 생각하시면 조금 더 이해하시기 편할 것 같습니다.

 

 

반대로 함수 내부에 result가 지역변수로 존재하지 않는다면 

result를 사용할 때 먼저 지역변수 result가 있는지 조회해 없는 것을 확인하고 다음으로 전역을 조회하게 됩니다. 여기서 전역변수 result가 존재하므로 코드가 문제없이 동작하는 것입니다.



그러면 함수 내에서 전역변수의 사용을 강제하고 싶으면 어떻게 할까요?

함수에서 사용하려는 변수가 함수 내에 지역변수로 존재하지 않는다면 

전역에서 동일한 이름의 변수가 있는지 자동으로 확인하기 때문에 함수 내에 코드가 길어지면 이 값이 어디서 참조되고 있는지 판단하기 어려울 때가 있을 수 있습니다. 

이럴 경우 애초에 함수 내에서 전역변수를 참조하겠다는 의미로 global 이라는 키워드를 사용할 수 있습니다. 

전역변수를 사용하겠다는 의미인 global을 사용하는 방법에 대해 알아보겠습니다. 

fields = []

def func1():
  fields = ["1", "2"]

func1()
print(fields)



먼저 전역변수로 fields라는 빈 리스트가 있습니다. 

이 값은 선언 당시에는 정의되지 않아 빈값으로 있다가 func1()이라는 함수를 거쳐 fields를 문자 1과 2가 들어있는 리스트로 변경해보겠습니다.

그 다음 fields를 출력해보겠습니다.

[]

 

이상하게도 fields에 값을 넣어주는 함수를 호출했지만 정작 출력 결과는 빈값입니다.

하지만 생각해보면 fields에 접근하는 부분은 오로지 func1() 함수뿐이니 이 부분이 제대로 동작하지 않았다고 생각해볼 수 있습니다.

값이 제대로 저장되지 않은 문제의 원인은 func1 함수 내에 

fields = ["1", "2"] 이 부분을 기존 전역변수에 선언된 fields를 사용하라는 의미가 아니라 

지역변수 fields를 선언하는 것으로 인식하게 되는 것이 문제입니다.

따라서 여기서 사용할 fields는 지역변수가 아니고 전역변수다. 그리고 전역변수를 사용하라는 의미를 부여하기 위해 코드를 다음처럼 만들어보겠습니다.

fields = []

def func1():
  global fields
  fields = ["1", "2"]

func1()
print(fields)

 

 

func1함수 내에서 global fields라고 선언하면 함수 내에서 사용하는 fields는 모두 전역변수임을 의미합니다. 따라서 fields를 출력한 결과는 다음과 같습니다. 

['1', '2']

 

 


같이 보시면 좋을 글

2021/02/10 - [파이썬/주식 자동매매] - 주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.

 

주식매매프로그램 개발 노하우, 소스를 담은 전자책이 발간되었습니다.

주식매매프로그램 개발 노하우에 관한 제 전자책이 발간되었습니다. https://kmong.com/gig/292764 주식매매프로그램, 쉽게 따라 만드는 노하우와 소스를 드립니다. | 36000원부터 시작 가능한 총 평 0개

jsp-dev.tistory.com

 

2021/01/31 - [파이썬/주식 자동매매] - Python 키움API 자동매매프로그램 개발-21.Python 기초편 함수(4)매개변수, 호출순서

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글