반응형
[변수의 종류]
- 파이썬에서 변수는 지역 변수(local variable), 전역 변수(global variable)로 나뉨
- 지역 변수: 함수 안에서 선언된 변수. 함수 안에서만 유의미
- 전역 변수: 함수 외부에서 선언된 변수
[지역 변수]
- 지역 변수: local variable이라고 불리며 함수 안에서 정의된 변수로서 함수 안에서만 사용 가능
- 파이썬에서는 특별한 언급이 없으면 함수 안에서 정의된 변수는 무조건 지역 변수임
- 지역 변수는 함수가 호출될 때 생성되고, 함수가 종료되면 소멸됨
- 변수가 의미 있는 범위를 변수의 영역(scope)이라고 함
- 아래는 함수 fruit 안에 지역 변수 b를 선언한 것임
def fruit():
b='banana'
print(b, '는 맛있어')
fruit()
print(b)
- 위의 fruit 라는 함수에서 b는 지역 변수이며 'banana'라는 문자열을 저장함
- fruit() 문장으로 함수를 호출하면 지역 변수 b가 생성되었다가, 함수가 종료되면 지역 변수 b는 소멸됨
- 따라서, print(b)를 입력하여도 b 라는 변수는 소멸된 상태이기 때문에 Error가 발생함
[전역 변수]
- 전역 변수: gloabal variable이라고 불리며 함수의 외부에 정의된 변수
def fruit():
print(b, '는 맛있어')
b='banana'
fruit()
- 위와 같이 코드를 구성했을 때, b는 함수의 외부에 정의된 전역 변수이며, fruit()를 호출하기 전에 정의되었음
- 함수는 호출되기 전에는 실행되지 않음
- 함수 fruit() 안에는 print() 호출 문장만 있고 지역 변수 b를 선언하지 않음
- 따라서 이때는 전역 변수 b를 사용함
def fruit():
b = 'orange'
print(b, '는 맛있어')
b='banana'
fruit()
print(b)
- 위와 같은 경우, 함수 호출 전에 전역 변수 b를 'banana'로 저장하였음. 그러나 fruit()가 호출되면서 함수 내부에서 지역 변수 'b'를 'orange'로 저장하고 있음. 이때 전역 변수와 지역 변수는 서로 구분됨.
- 파이썬은 함수 내부에서 정의된 변수는 무조건 지역 변수로 간주하기 때문에, fruit()를 호출한 결과로 print()를 통해 'orage는 맛있어'가 출력됨.
- 그러나 그 다음 줄의 print(b)는 전역 변수 b를 호출하여 'banana'가 출력됨.
def fruit():
print(b, '는 맛있어')
b = 'orange'
print(b, '는 맛있어')
b='banana'
fruit()
print(b)
- 위의 코드에서는 오류가 발생함. 함수 안에서 b를 지역 변수로 볼 지, 전역 변수로 볼 지 알 수 없음.
- 함수 안에서 전역 변수의 값을 변형하려면 global 키워드를 사용해야 함
def fruit():
global b
print(b, '는 맛있어')
b = 'orange'
print(b, '는 맛있어')
b='banana'
print(b) # banana
fruit() # banana는 맛있어 \n orange는 맛있어
print(b) # orange
- 위의 식을 보면, 함수 내에서 b를 전역 변수로 사용하겠다고 선언한다. 따라서 함수 내부에서 전역 변수 b의 값을 바꾸면 실제로 함수 밖의 전역 변수 b 값도 변경된다.
- 주의할 점은, 변수는 선언 이후에만 사용할 수 있음. 파이썬에서는 변수에 값을 할당하는 순간 변수가 선언됨
[매개 변수]
- 매개 변수도 일종의 지역 변수임. 따라서 아래와 같이 코드를 작성했을 때, 함수에 전역 변수를 매개변수로 입력하고 내부에서 매개 변수에 다른 값을 할당하여도 전역 변수의 값은 바뀌지 않음
def fruit(b):
print(b, '는 맛있어')
b = 'orange'
print(b, '는 맛있어')
b='banana'
print(b) # banana
fruit(b) # banana는 맛있어 \n orange는 맛있어
print(b) # banana
- 매개 변수로 리스트를 전달할 때는 어떻게 될까? 리스트는 변경 가능한 객체이기 때문에 함수 내부에서 매개변수로 받은 리스트를 변경하면, 함수 바깥의 실제 리스트도 변경된다. 그러나 이는 리스트를 '수정' 할 때의 이야기이다. 매개변수로 리스트를 받은 다음, 아예 다른 리스트를 새로 할당하면 매개 변수는 지역 변수가 된다.
def sub(mylist):
# 리스트가 함수로 전달됨
mylist = [1, 2, 3, 4] ## 새로운 리스트가 매개변수로 할당됨 (매개변수로 받은 리스트를 변경하는 것과는 다름)
print('함수 내부의 mylist:', mylist)
return
mylist = [10, ,20, 30, 40]
sub(mylist) # 함수 내부의 mylist: [1, 2, 3, 4]
print('함수 외부의 mylist:', mylist) # 함수 외부의 mylist: 10, ,20, 30, 40]
반응형
'Python' 카테고리의 다른 글
[Python] 람다식 (lambda, 무명 함수) (0) | 2023.10.12 |
---|---|
[Python] 함수 반환 값, return (0) | 2023.10.12 |
[Python] 참조값에 의한 인수 전달 - call by value, call by reference (0) | 2023.10.10 |
[Python] 함수의 인수, 매개변수, 반환값 (0) | 2023.10.10 |
[Python] 함수 (0) | 2023.10.10 |