공부 기록장

전역 변수와 지역 변수 본문

코딩 테스트/정리 및 복습

전역 변수와 지역 변수

빛나무 2024. 3. 22. 19:41

1. Call by value와 Call by reference

C언어를 공부하면서 들어봤던 표현이다.

 

함수의 인자를 전달하는 방식에 대한 명명인데,

인자로 어떤 타입을 전달하느냐에 따른 차이가 있다

 

1) Call by value : 변수를 복사한 값을 전달하는 방식

함수의 인자를 받을 때, 변수에 담긴 값 자체를 stack에 복사하여 넘겨준다.

 

예를 들어 변수 a가 있고 함수 func1가 있을 때,

func1(a)에서 전달받은 a는 a 자체(주소 값)가 아니라 a의 복사값인 것이다.

 

따라서 함수 내에서 해당 인자를 조작해도

원본 변수 a는 변하지 않는다.

 

원본이 수정되지 않아 안전하지만, 함수를 사용해 전역 변수를 바꾸고 싶을 때는

리턴 값을 다시 전역 변수로 넣어줘야해서 번거롭다.

 

2) Call by reference : 인자로 받은 변수의 주소 값을 전달하는 방식

함수의 인자를 받을 때, 변수가 가르키는 주소 값을 전달한다.

예를 들어 변수 a 가 있고 함수 func2가 있을 때,

func2(a)에서 전달받은 a는 원본 전역 변수 a의 주소값이다. 

 

따라서 함수 내에서 해당 인자를 조작하면

원본 변수의 주소값을 타고 들어가

해당 값을 변경한다.

 

전역 변수의 즉각적인 변경이 가능하지만,

부주의로인해 변수를 잘못 조작해 프로그램에 문제를 야기할 수 있다.

 

 

2. Call by assignment (= Call by object-reference)

Python의 함수 인자 전달 방식은 Call by assignment이다.

 

Python은 모든 것을 "객체"로 판단한다.

객체는 현실 세계로 비유하면 물건으로 생각할 수 있다.

 

Python에서 name = "Johyun"이라는 코드를 실행하면,

"Johyun"이라는 문자열 객체가 생기고

해당 객체에 대한 name이라는 이름표가 붙게 되는 것이다.

 

다시 말해, python에서 변수는 특정 메모리 공간을 할당 받는 컨테이너 개념이 아니라

어떤 객체에 붙여진 이름표일 뿐이다.

 

 

Python에서는 global인지 local인지 영역에 따라 변수들이 정보를 저장하는 namespace가 따로 있다.

즉, 전역 변수를 함수에서 인자로 받아오더라도 함수 내에서는 지역변수(이름표)에 불과하다.

 

 

3. 전역 변수와 지역 변수

전역 범위에서 활동하는 변수이다.

여기서 전역 범위란, 함수를 포함하여 스크립트 전체의 모든 요소를 의미하고

스크립트 전체의 어떤 요소에서도 변수에 접근 가능한 것이 전역 변수이다.

 

지역 범위에서만 영향을 주고 받을 수 있는 변수이다.

예를 들어 함수 내에서 a=1이라는 변수 선언을 한다면

변수 a는 해당 함수 안에서만 사용될 수 있다.

 

 

4. 전역 변수를 특정 함수에 가져오기

함수 안에서 전역 변수의 값을 변경하기 위해서는

global 키워드를 사용해 선언해주면 된다.

 

global 키워드를 사용할 때 유의할 점은

키워드와 함께 할당이 불가하고

"global a" 선언을 한 뒤에, 이후 줄에서 변수에 값을 넣어줄 수 있다.

 

 

5. 프로그래머스 환경에서 solution 함수 내의 변수를 다른 함수에서 변경하는 법

1) 각각의 함수에서 변수를 global 처리해준다.

def function():
	global a
    a += 3
    
def solution():
	answer = []
    
    global a
    tr = 3
    function()
    print(tr)
    
    return answer

 

출력 값은 5 이다

 

 

2) 함수의 인자로 변수를 전달해준다.

def function2(b):
	b += 2
    return b
    
def solution():
	answer = []
    
    b = 3
    b = function(b)
    print(b)
    
    return answer

 

 

3) solution 함수 내에 함수를 만들고 nonlocal 명령어로 새로운 지역 변수가 되지 않게 설정한다.

 

 

참고 자료

- Python은 Call by reference일까? Call by value일까?

https://aalphaca.tistory.com/4

 

- 전역 변수 지역 변수 사용법 총 정리 / global, nonlocal

https://codingpractices.tistory.com/entry/Python-%EC%A0%84%EC%97%AD-%EB%B3%80%EC%88%98-%EC%A7%80%EC%97%AD-%EB%B3%80%EC%88%98-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%B4%9D-%EC%A0%95%EB%A6%AC-global-nonlocal

 

- python 범위 규칙과 값 할당

https://sikaleo.tistory.com/99

 

- python의 global과 nonlocal 키워드 사용법

https://www.daleseo.com/python-global-nonlocal/

 

- 함수 안의 함수

https://dojang.io/mod/page/view.php?id=2365

'코딩 테스트 > 정리 및 복습' 카테고리의 다른 글

딕셔너리 자료형  (1) 2024.03.22
임의의 최대값 최소값  (0) 2024.03.22
완전 탐색과 백트래킹  (0) 2024.03.21
input() vs sys.stdin.readline()  (0) 2024.03.20
코딩 테스트 문제 유형 파악하기  (1) 2024.03.20