인프런 커뮤니티 질문&답변

파란행복님의 프로필 이미지

작성한 질문수

나도 할 수 있다! SW강사!

Python 12강_형변환

파이썬 관련 질문 드립니다. (변수의 참조 수정 범위)

작성

·

286

0

age = 11

def agePrint():

    age += 1

    print(age)

agePrint()

하면 에러가 납니다. age가 함수 외부에 있으니 당연한거구요.

근데 age가 리스트면

age = [11, 12, 13]

def agePrint():

    age[0] = 15

    print(age)

agePrint()

하면 에러없이 잘 수행됩니다. 그냥 변수를 변경하면 안되지만 리스트는 왜 되는건가요?

바쁘시겠지만 답변 기다립니다.

답변 4

1

그렇다면 변수라는 의미를 더 깊게 설명드리도록 할게요!

처음 답변에서 파이썬의 모든 타입은 객체라고 말씀드렸죠?
파이썬에서 변수객체를 가리키는 화살표라고 보시면 됩니다.

그래서 변수에는 '대입'한다라는 표현을 쓰지 않고 '바인딩(binding), 가리킨다'라는 표현을 씁니다.

이미 만들어진 변수에 새로운 값들을 넣어줄 때,

불변객체는 새로운 값을 새로운 메모리에 할당한 후 그 값을 변수가 가리키게(바인딩) 합니다.
반면 가변객체는 새로운 값이 들어와도 같은 메모리에서 변경해주죠.

조금 어렵죠?
아래 예제를 볼게요!

가변객체는 변경 전 후 고유주소(identity) 값이 그대로인 반면에
불변객체는 변경 전 후 고유주소 값이 바뀌었습니다.

이제 조금 이해가 되셨을까요?

1

안녕하세요 제주코딩베이스캠프입니다!

정말 좋은 질문이네요 :)

우선 list가변객체이기 때문에 함수로 접근 시 값이 변할 수 있으며
가변객체에는 list, set, dic이 있습니다.

반면 int, floot, stringtuple과 같이 불변객체이기 때문에 값이 변할 수 없으며
불변객체에는 int, float, bool, tuple, str, unicode가 있습니다.

더 깊게 설명해보자면,

python의 모든 데이터 타입은 '객체(object)'이며 이를 통해 메모리의 정보를 관리합니다.
객체에는 세가지 특성이 있으며 값(value), 유형(type), 정체성(identity)이라고 부릅니다.

예를 들어볼까요?

a = 100

100이라는 값을 변수 a에 할당했습니다.
(할당이라는 표현이 적절치는 않지만 설명을 위해 지나가도록 할게요.)

값(value)은 메모리에 기록된 내용입니다.
여기에서는 100을 의미합니다.

유형(type)은 데이터의 종류입니다.
숫자를 넣었으니 int형을 의미합니다.(type(a)를 하면 나오는 값)

정체성(identity)은 객체를 식별하기 위한 고유주소입니다.
메모리상에 위치한 주소 값이며 'id(a)'를 하면 나오는 값 입니다.

즉, 가변객체는 값을 변경할 수 있는 객체를 의미하며
불변객체는 값을 변경할 수 없는 객체를 의미합니다.

이해가 되셨나요?

더 궁금하신 점은 언제든지 질문게시판을 이용해주세요 :)

0

파란행복님의 프로필 이미지
파란행복
질문자

네 이해됐습니다.

파이썬을 더 잘이해하는데 도움이 되었습니다.

고맙습니다.

0

파란행복님의 프로필 이미지
파란행복
질문자

답변 감사 드립니다.

제가 질문한 사항은 이해가 되었습니다. 근데 또 다른 의문이 생겼습니다.

답변 마지막 부분에 <가변객체는 값을 변경할 수 있는 객체를 의미하며 불변객체는 값을 변경할 수 없는 객체를 의미한다>고 하셨는데...

변수가 원래 값 변경이 가능한거잖아요. 물론 이 의미가 말씀하신 의미와 다를거라고 생각은 하지만  <가변객체는 값을 변경할 수 있는 객체를 의미하며 불변객체는 값을 변경할 수 없는 객체를 의미한다>라는 말을 다시 한번 짚어주시면 정말 감사하겠습니다.

고맙습니다.