CodeGym /행동 /Python SELF KO /변수의 스코프

변수의 스코프

Python SELF KO
레벨 6 , 레슨 4
사용 가능

10.1 함수의 지역 변수

Python에서는 변수가 생성된 순간부터 그 스코프의 끝까지 접근할 수 있어. 보통 변수가 선언된 함수가 스코프가 되는 경우가 많아. 만약 변수가 모든 함수 밖에 선언되었다면, 그건 전역 변수(global variable)라고 불려.

Python에서 변수의 스코프는 변수가 사용 가능한 컨텍스트를 정의해. 스코프는 이름 충돌을 피하고 데이터 접근을 관리하는 데 도움이 돼. Python의 주요 스코프 유형은 다음과 같아:

지역 스코프: 함수 내에서 생성된 변수는 그 함수의 지역 스코프에 존재하고, 그 안에서만 접근 가능해.

내포된 함수의 스코프: 만약 함수가 다른 함수 안에 정의되어 있다면, 그 함수의 변수는 내포된 함수에서만 접근 가능해.

전역 스코프: 스크립트나 모듈 수준에서 정의된 변수는 전역 변수로 간주되고, 같은 모듈의 어디서든지 접근 가능해.

내장 스코프: 이것은 모든 내장 객체와 함수(Python에서 기본 제공되는 것들, 예를 들어, print()와 len())를 포함하는 특별한 스코프야.

LEGB 규칙

Python은 변수 해석을 위해 LEGB 규칙을 사용해. 이 규칙은 인터프리터가 변수를 찾는 순서를 정의해:

  • L (Local) — 먼저 지역 스코프에서 찾아봐.
  • E (Enclosed) — 그런 다음 모든 내포된 함수의 스코프에서, 가장 가까운 것부터 바깥쪽으로.
  • G (Global) — 그 다음으로 전역 스코프에서.
  • B (Built-in) — 마지막으로 내장 스코프에서.

사용 예시


x = "global"  # 전역 변수

def outer():
    y = "outer local"  # 외부 함수의 지역 변수
    def inner():
        z = "inner local"  # 내포된 함수의 지역 변수
        print(x)  # "global" 출력
        print(y)  # "outer local" 출력
        print(z)  # "inner local" 출력
    inner()

outer()

변수 zinner() 함수 안에서만 접근 가능해.

변수 youter() 함수 내와 그 안에 선언된 모든 함수에서 접근 가능해.

변수 x는 현재 파일(모듈) 어디서든지 접근 가능해.

10.2 전역 변수에 접근하기: global x

Python의 흥미로운 기능 중 하나는 외부 스코프(현재 스코프가 내포된)에 있는 변수들은 읽기만 가능하다는 거야.

외부 변수에 무언가를 쓰려고 하면, 동일한 이름의 지역 변수가 생성되고 외부 변수에 대한 접근은 잃게 돼.

예시:


x = 10

def change_global():
    print(x)  # 이건 오류를 발생시켜, x가 할당 후에 지역 변수로 간주될 거니까
    x = 20  # 여기서 지역 변수 x가 생성돼
    print(x)  # 20을 출력 (지역 변수 x에 접근)

change_global()
print(x)  # 10을 출력

이 예시는 UnboundLocalError를 발생시켜, 왜냐면 Python 인터프리터는 먼저 x = 20 할당을 보고, x가 지역 변수라고 생각하거든. 하지만 인터프리터가 print(x) 줄에 도달했을 때, 아직 정의되지 않은 지역 변수 x를 찾지 못해.

이렇게 하면 지역 변수가 실수로 전역 변수를 변경하지 않도록 안전하게 할 수 있어.

global 연산자

함수 내부에서 전역 변수의 값을 의도적으로 변경해야 한다면, global 연산자를 사용할 수 있어. 이 연산자는 변경이 지역 변수가 아닌 전역 변수에서 이루어져야 함을 명시적으로 지정해 줘.

함수 내부에서 전역 변수의 값을 변경하려면, 함수의 시작 부분에서 global을 사용해 그 변수를 선언해야 해. 이렇게 하면 함수가 변수에 쓰기 접근권한을 갖게 돼:


x = 10

def change_global():
    global x  # x를 전역 변수로 선언
    print(x)  # 10을 출력 (전역 변수 x에 접근)
    x = 20  # 전역 변수 x에 새 값 할당
    print(x)  # 20을 출력 (전역 변수 x에 접근)

change_global()
print(x)  # 20을 출력

global 연산자를 사용하면 오류를 피하고 전역 변수를 제대로 관리할 수 있어.

전역 변수는 프로그램을 덜 예측 가능하게 하고 이해하기 어렵게 만들 수 있어, 왜냐면 프로그램 어디서든 그 값이 변경될 수 있거든. 특히 프로그램이 크고 여러 프로그래머가 함께 개발할 때는 특히 그렇지.

가끔 전역 변수를 사용하는 것이 불가피할 수도 있지만, 가능하다면 그 사용을 최소화하려고 노력해야 해. 전역 변수 대신, 함수의 매개변수, 반환 값, 그리고 상태를 저장하기 위한 클래스를 사용하는 것을 고려해봐.

전역 변수의 사용은 예기치 않은 부작용을 초래하고, 코드의 디버깅과 테스트를 어렵게 하며, 재사용성을 떨어뜨릴 수 있어. 그래서 전역 변수는 신중하게 사용하고, 필요한 경우에만 사용하길 권장해.

10.3 비-지역 변수에 접근하기: nonlocal

전역 변수와 지역 변수 외에도, Python에는 중간 스코프의 변수가 존재해. 예를 들어, 함수가 다른 함수 안에 내포되어 있을 때. 이런 변수들과 작업하기 위해 nonlocal 연산자가 사용돼.

nonlocal 연산자는 내포된 함수에서 전역 변수를 제외하고 가장 가까운 스코프의 변수들의 값을 변경할 수 있어.

nonlocal 연산자는 내포된 함수에서 지역 변수를 새로 생성하는 것을 피하는 데 도움을 줘, 외부 함수에 정의된 변수를 변경할 필요가 있을 때 말이야. nonlocal을 사용하지 않으면, 변경은 내부 함수의 지역 변수에만 영향을 미치고, 외부 함수의 변수에는 영향을 주지 않아.

예시:


def outer():
    count = 0

    def inner():
        nonlocal count
        count += 1
        return count

    return inner

counter = outer()
print(counter())  # 1을 출력

다음은 nonlocal을 사용하여 카운터를 만드는 실제적인 예시야:


def create_counter():
    count = 0
    
    def increment():
        nonlocal count
        count += 1
        return count
    
    return increment

counter = create_counter()
print(counter())  # 1을 출력
print(counter())  # 2를 출력
print(counter())  # 3을 출력

이 예시는 nonlocal이 호출 간 상태를 유지하는 함수를 만드는 실제 시나리오에서 어떻게 사용될 수 있는지를 보여줘.

2
과제
Python SELF KO, 레벨 6, 레슨 4
잠금
글로벌 변수 사용
글로벌 변수 사용
2
과제
Python SELF KO, 레벨 6, 레슨 4
잠금
nonlocal 변수 사용
nonlocal 변수 사용
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION