작성자: admin 작성일시: 2016-09-07 14:38:20 조회수: 876 다운로드: 78
카테고리: Python 태그목록:

파이썬 함수 기초 2

지역 변수

함수에 넣은 입력 변수나 함수 안에서 만들어진 변수는 함수 바깥에서는 사용할 수 없다. 혹시 이름이 같은 변수가 있다고 하더라도 별개의 변수가 된다.

따라서 함수 안에서 만들어지고 사용되는 함수를 지역 변수, 영어로 local variable 이라고 한다.

실제로 확인해 보자. 일단 함수 바깥에 혹시라도 y라는 변수가 있으면 del 명령으로 지운다.

In:
del y

NameErrorTraceback (most recent call last)
 in ()
----> 1 del y

NameError: name 'y' is not defined

기존에 y라는 변수가 없었으면 그런 변수가 없다는 오류가 나온다. 만약 기존에 y라는 변수가 있었으면 오류가 출력되지 않고 지워지기만 한다

이제 다음과 같이 a라는 이름의 지역 변수를 가지는 함수를 만들고 실행시킨다.

In:
def f(x):
    y = 10 * x
    print("y = ", y)
    return y
In:
f(10)
y =  100
Out:
100

y라는 변수가 생겨났는지 다시 확인한다.

In:
y

NameErrorTraceback (most recent call last)
 in ()
----> 1 y

NameError: name 'y' is not defined

함수 안에서 만든 y라는 변수는 함수 밖에는 생성되지 않았다.

이번에는 함수 바깥에서 y라는 변수를 사용해 보자.

In:
y = 1000
In:
y
Out:
1000

이제 함수를 실행시킨다.

In:
f(1)
y =  10
Out:
10

다시 바깥에서 y값을 확인하면 이전과 같다.

In:
y
Out:
1000

즉, 함수 안에서 만들어지는 지역 변수는 함수 바깥에 아무런 영향을 주지 않는다.

연습 문제 1

10개의 숫자를 입력하면 "그 숫자들의 합"과 "그 숫자들을 제곱한 숫자들의 합"의 차이(큰 수에서 작을 수를 뺀 값)를 계산하는 함수 diffsum를 만든다. 큰 수에서 작은 수를 뺀 결과이므로 항상 0보다 크거나 0과 같아야 한다.

전역 변수

하지만 지역 변수와 반대로 함수 바깥에서 만들어진 변수는 함수 안에서 사용할 수 있다.

In:
z = 3

def f2(x):
    y = z * x
    print("y =", y)
    print("z =", z)
    return y
In:
f2(10)
y = 30
z = 3
Out:
30

다만 이 때 바깥의 변수와 같은 이름의 변수를 함수 안에 만들면 안된다.

만약 바깥의 변수와 같은 이름의 변수를 함수 안에 다시 만들면 함수 안에서는 그 지역 변수를 사용하다가 함수 바깥으로 나오면 지역 변수는 사라지고 원래의 변수값으로 되돌아 온다.

따라서, 함수 안에서는 함수 바깥에 있는 변수의 값을 바꿀 수 없다.

In:
z = 3

def f3(x):
    z = 99
    y = z * x
    print("y =", y)
    print("z =", z)
    return y
In:
f3(10)
y = 990
z = 99
Out:
990

함수 바깥에서는 z가 여전히 3이다.

In:
z
Out:
3

만약 함수안에서 함수 바깥에 있는 변수의 값을 꼭 바꿔야만 한다면 다음과 같이 함수 이름 앞에 global 키워드를 선언해 주면 된다.

In:
z = 3

def f4(x):
    global z
    z = 99
    y = z * x
    print("y =", y)
    print("z =", z)
    return y
In:
f4(10)
y = 990
z = 99
Out:
990
In:
z
Out:
99

함수 바깥의 z 값이 99로 바뀌어 있는 것을 확인할 수 있다.

연습 문제 2

함수 바깥에 m 이라는 변수를 만들고 그 값을 0으로 놓는다.

앞에서 만든 diffsum 함수를 고쳐서 함수를 실행할 때 마다 diffsum 함수에서 계산된 값이 원래 있던 m 보다 크면 m을 계산된 값으로 바꾸는 함수 diffsum2 를 만든다.

질문/덧글

[너무 기초적인 질문] 함수 안에서 전역변수 변경 crys*** 2016년 10월 3일 7:46 오후

안녕하세요.
함수 안에서 global을 선언하고 m 값을 변경하고자 하는데,
아래 코드 실행 후에 다음 셀에서 m값을 보면 그대로 0입니다.(도커 위의 주피터 노트북)
어떻게 하면 전역변수를 변경할 수 있는지 문의드립니다.

del m
m=0
def diffsum2(x1,x2,x3):
global m
y1=x1+x2+x3
y2=x1**2 + x2**2 + x3**2
if ((y2-y1)>m):
m=(y2-y1)
return m
diffsum(1,0.2,0.3,0)

답변: [너무 기초적인 질문] 함수 안에서 전역변수 변경 관리자 2016년 10월 4일 9:58 오후

(1) diffsum2 를 정의하시고 diffsum 을 호출하고 있습니다.
(2) diffsum 호출도 쉼표와 마침표가 잘못된것으로 보입니다.
(3) 위의 두 부분을 고치면 m이 제대로 변경됩니다.

사용자에 의해 삭제되었습니다. crys*** 2016년 10월 4일 7:58 오전

사용자에 의해 삭제되었습니다.

%who 로 변수 확인하기 samk*** 2017년 3월 4일 4:37 오후

%who y(변수명) 은 의도대로 동작하지 않습니다.

%who 또는 %who (data type)로 확인해야

설명해주신대로 y변수의 값을 확인 할 수 있습니다.

답변: %who 로 변수 확인하기 관리자 2017년 3월 12일 11:39 오전

위 코드에서 ``%who y`` 는 ``y``라는 변수가 없다는 것을 확인하기 위한 것입니다. 명령을 입력했을 때 나오는 영어 메세지를 읽어 보세요.

답변: 답변: %who 로 변수 확인하기 samk*** 2017년 3월 16일 10:38 오전

`%who y`으로는 y변수의 존재를 확인할 수 없습니다.

해당 타입의 변수를 찾는 명령이기 때문인것 같습니다.
명령을 입력했을때 영어 메시지에도 그렇게 나와있습니다.
*No variables match your requested type.*

`%who` 명령어를 확인해도 매개변수로 변수이름을 입력해서 변수를 찾는 법은 알 수 없었습니다.

답변: 답변: 답변: %who 로 변수 확인하기 관리자 2017년 3월 16일 12:44 오후

제가 matlab의 ``who`` 명령과 헷갈렸습니다. ipython 의 ``%who`` 명령은 말씀하신대로 타입 기준이 맞습니다. 노트북은 곧 수정하도록 하겠습니다.