본문 바로가기
인터페이스 개발/Python

Python - 함수[변수의 범위] - 지역 변수, 전역 변수

by cooluk 2020. 7. 24.

Chap.7 함수[변수의 범위] - 지역 변수, 전역 변수

 

변수의 범위

지역 변수, 전역 변수

 

 

지역 변수

  • 함수 내에서 사용된 변수
  • 함수 내에서 만 사용 가능
        - 함수 밖에서 사용 불가
def calsum(n): # 변수 n은 호출에서 초기화
total = 0 # 변수 total은 함수 내에서 초기화
for num in range(n+1): # 변수 num 또한 함수 내에서 초기화
total += num
return total

세 변수 n, total, num 은 모두 지역변수

 

def kim():
temp = '김과장의 함수'
print(temp)
kim()
print(temp) # name 'temp' is not defined

결과
name 'temp' is not defined

 

def kim():
temp = '김과장의 함수'
print(temp)
def lee():
temp = 2**10
return temp
def park(a):
temp = a*2
print(temp)
kim()
print(lee())
park(6)

결과

김과장의 함수
1024
12

 

 

전역 변수

  • 어디서든 접근 가능한 변수
  • 탑 레벨에서 사용된 변수

salerate = 0.9
def kim():
print("오늘의 할인율:", salerate)
def lee():
price = 1000
print("가격 :", price * salerate)
kim()
salerate = 1.1
lee()

결과

오늘의 할인율: 0.9
가격 : 1100.0

 

price = 1000
def sale():
price = 500
sale()
print(price)

결과

1000

price 두 변수는 다르다.

 

price= 1000
def sale():
price = 500
print("sale", id(price))
sale()
print("global", id(price))

결과

sale 2097613157520
global 2097613157264

대입연산의 우선 순위 -> 지역변수가 높다. 함수 안에서 읽을 때 쓸 때 다르다.
id() : 동일한 객체 여부를 판별하는 연산자
test -> 전역변수에서 두 값이 같으면 id가 같다.

 

 

예제

전역변수에 대하여 쓰기 연산을 하고 싶을 때

price = 1000
def sale():
global price
price = 500
sale()
print(price)

결과

500

# 추천사항 : 전역변수는 가급적 사용하지마라 -> 지역변수 지향
# 전역변수는 오작동의 근원이다. 상수처럼 읽기용으로는 써라.

 

 

docstring

  • 함수의 도움말
  • 함수의 코드 블록 앞에 문자열로 지정 (위치가 고정되어 있다.)
  • help(함수명) 호출 시 출력될 문자열

def calcsum(n):
"""1 ~ n까지의 합계를 구해 리턴한다."""
total = 0
for i in range(n+1):
total += i
return total
help(calcsum)

결과

Help on function calcsum in module __main__:

calcsum(n)
1 ~ n까지의 합계를 구해 리턴한다.

 

 

예제(1)

min = FindMin(2, 7, 5, -1, 20)

 

내 풀이

def FindMin(int1, *ints):
temp = int1
for num in ints:
if temp >= num : temp = num
return temp
min = FindMin(2, 7, 5, -1, 20)
print('최소값:', min)

 

강사님 : 수가 10000 이하라 가정

def FindMin(*numbers):
min = 999999
for num in numbers:
if num < min:
min = num
return min
min = FindMin(2, 7, 5, -1, 20)
print('최소값:', min)

 

 

예제(2)

max = FindMax(2, 7, 5, -1, 20) 해보기

def FindMax(int1, *ints):
temp = int1
for num in ints:
if temp < num : temp = num
return temp
max = FindMax(2, 7, 5, -1, 20)
print('최대값:', max)

 

 

예제(3)

swap으로 함수 이해하기

def swap(x, y):
temp = y
y=x
x=temp
print('x', x)
print('y', y)
a=10
b=20
swap(a, b)
print('a', a)
print('b', b)

결과

x 20
y 10
a 10
b 20

a, b는 swap 함수의 영향을 받지 않았다!
지역 함수는 stack 영역!

stack frame에 push, pop되며 stack은 top만 볼 수 있다.
call by value (복사본)

읽기는 지역 변수(stack frame) 살피고 전역 변수 살핀다.
지역 변수가 우선 순위가 높다.
쓰기는 지역 변수 살피고 전역 변수로 가지 않는다.

 

 

댓글