지역변수 개념이 헷갈립니다.

아래 코드 실행시 에러가 발생하는데요.

a = "1"
def func(abc, defg):
  a += "2"
  print(a)
func(3,4)

Traceback (most recent call last):
File "main.py", line 42, in
func(3,4)
File "main.py", line 40, in func
a += "2"
UnboundLocalError: local variable 'a' referenced before assignment

아래 코드는 에러가 나질 않습니다.

a = ["1"]
def func(abc, defg):
  a.append("2")
  print(a)
func(3,4)
a = "1"
def func(abc, defg):
  a = "2"
  print(a)
func(3,4)

제가 전역변수와 지역변수의 개념에 대해 헷갈리고 있는거 같긴 한데 ㅠ 정확하게 어떤 차이인지를 모르겠네요 ㅠ

juyoungjin2 443

2022년 3월 29일 12:33 오후

목록으로
2개의 답변이 있습니다. 1 / 1 Page

함수 안에서 전역변수를 참조하는 것은 가능합니다. 그 전역변수가 리스트(mutable), 문자열(immutable)인 것과는 상관없습니다.

즉, 다음이 가능합니다.

a = "1"
def b():
    print(a)  # 1 출력

aList = ["1"]
def bList():
    print(aList)  # ["1"] 출력

b()
bList()

하지만 다음처럼 전역변수 값을 참조하여 값을 새로 할당하는 행위, 즉 assignment(=)를 하려고 하면 오류가 발생합니다. 왜냐하면 이 때 참조하는 변수는 전역변수가 아닌 지역변수가 되는데... 해당 지역변수는 아직 assingment 전이라 참조가 불가능하기 때문입니다. (설명이 어렵네요 ㅜㅜ)

a = "1"
def b():
    a = a + "2"

b()  # UnboundLocalError: local variable 'a' referenced before assignment 발생

리스트의 경우도 마찬가지입니다.

aList = ["1"]
def bList():
    aList = aList + ["2"]

bList()  # UnboundLocalError: local variable 'aList' referenced before assignment 발생

이런 경우 오류를 방지하려면 첫번째 경우에는 global a, 두번째 경우에는 global aList 와 같은 문장이 필요합니다.

그리고 또 헷갈리는게 다음처럼 전역변수를 참조하지 않고 값을 새로 할당하면 오류가 발생하지 않습니다. 하지만 이것은 지역변수로 인식되어 전역변수의 값이 변하지 않습니다. (지역변수라 전역변수와 상관이 없습니다.) 즉, 함수내에서 전역 변수명과 동일하게 assignment를 하더라도 지역변수로 생성됩니다.

a = "1"
def b():
    a = "2"

b()
print(a)  # 1 출력

리스트도 마찬가지입니다.

aList = ["1"]
def bList():
    aList = ["2"]

bList()
print(aList)  # ["1"] 출력

하지만 또 한가지 헷갈리는게 다음과 같은 경우입니다.

aList = ["1"]
def bList():
    aList.append("2")

bList()
print(aList)  # ["1", "2"] 출력

이러한 것이 가능한 이유는 함수내에서 전역변수를 참조하는 것이 가능하기 때문입니다.

도움이 되시기를 바랍니다.

박응용

M 2022년 3월 29일 5:49 오후

응용님 답변 너무 감사드립니다.
자세한 설명 덕분에 이해가 되는거 같습니다 ㅠ
생각보다 헷갈리는 개념이었네요 ㅠ
복받으세요

juyoungjin2

2022년 3월 29일 9:23 오후