참고 영상: 조코딩 - 파이썬 날개달기
mutable은 값이 변한다는 뜻이고, immutable은 값이 변하지 않는다는 의미입니다. 자료형마다 특징이 다릅니다.
변하지 않는 자료형
정수, 실수, 문자열, 튜플
a = 1
def var(a):
a = a + 1
var(a)
print(a)
실행값
1
2가 나올 것 같지만 1이 나옵니다. 왜냐하면 a는 전역 변수로 선언되었고 a를 함수 안에 지역 변수로 선언해줘야만 사용 가능합니다.
a = 1
def var(a):
a = 3
a = a + 1
var(a)
print(a)
실행값
1
이런 식으로 함수 안에 a = 3이라고 변수를 선언해주면 또 꼭 4가 나올 것 같지만 1이 나옵니다. 함수에 사용된 a는 지역 변수이기 때문에, 함수 바깥의 영역에서 호출하여 사용할 수 없기 때문입니다.
a = 1
def var(a):
a = 3
a = a + 1
print(a)
var(a)
실행값
4
대신 함수 안에 변수 a에 대한 실행값을 호출해주고, 함수를 불러온다면 4가 나옵니다.
또한, 바깥의 a를 사용하기 위해서 전역 변수를 선언할 수 있습니다. 함수 안에서 함수 바깥의 변수를 사용하겠다는 의미입니다.
a = 1
def vartest():
global a
a = a + 1
vartest()
print(a)
이 방법은 함수 안에서 global로 전역변수를 선언한 경우입니다.
함수 밖에서 global로 전역변수를 선언하는 방법도 있다고 합니다.
global a
a = 1
def vartest():
global a
a = a + 1
vartest()
print(a)
실행값
2
대신 global이 함수 바깥, 안쪽에서 두 번 사용되었습니다. 함수 밖에서 global로 전역변수를 선언하였어도, 함수 안에도 전역변수를 또 명시해주어야 합니다.
함수 안에서 전역 변수를 명시해주지 않으면, 해당 변수는 지역변수로 처리됩니다.
아래 코드로 함수 안에서 전역 변수를 명시하는 부분을 삭제하여 다시 보겠습니다.
global a
a = 1
def vartest():
a = a + 1
vartest()
print(a)
실행값
UnboundLocalError: local variable 'a' referenced before assignment
다른 곳에서는 그냥 a의 값이 1이 출력된다고 하는데 저는 error가 바로 뜨네요.
전역 변수를 local scope에서 사용하려면 지역 영역에서 global을 사용해야 함을 알려주고 있습니다.
근데 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니라고 합니다.
변할 수 있는 자료형
리스트, 딕셔너리, 집합
b = [1,2,3]
def var2(b):
b = b.append(4)
var2(b)
print(b)
실행값
[1,2,3,4]
b의 경우 변할 수 있는 자료형 리스트이기 때문에 b의 값에 4가 appned 됩니다.