Python 에서 가 변 적 이 고 가 변 적 이지 않 은 대상 에 대한 심도 있 는 설명

선행 지식
Python 에서 모든 것 이 대상 입 니 다.
Python 에 값 전달 이 존재 하지 않 습 니 다.모든 전달 은 대상 의 인용 이 고 주소 라 고 볼 수 있 습 니 다. 
어떤 가 변 대상,어떤 가 변 대상 이 있 습 니까?
가 변 대상:문자열,모듈,숫자(int,float)
가 변 대상:배열,사전,집합 
가 변 대상 과 가 변 대상 의 차이?
가 변 대상:대상 내용 을 바 꾸 면 대상 이 메모리 에 있 는 주 소 는 바 뀌 지 않 습 니 다.
가 변 대상:대상 의 내용 을 바 꾸 면 대상 이 메모리 에 있 는 주소 가 변 경 됩 니 다.다른 값 을 저장 해 야 한다 면 새 대상 을 만들어 야 합 니 다. 
가 변 대상 의 응용 장면
그것들 은 상량 의 해시 값 이 필요 한 곳 에서 중요 한 역할 을 한다.예 를 들 어 사전 의 키 로 서
메모리 각도 에서 말 하면 어떤 차이 가 있 습 니까?
불가 변 대상

Python 의 변 수 는 메모리 공간 이 있 습 니 다.
구체 적 인 데이터(대상)에 도 메모리 공간 이 있 습 니 다.
한편,변수 저장(지향)은 데이터(대상)를 저장 하 는 메모리 주 소 를 대상 참조 라 고도 부른다.
가 변 적 이지 않 은 대상 은 대상 의 내용 자체 가 가 변 적 이지 않다 는 것 을 가리킨다
변 경 된 것 은:값 을 바 꾸 면 새로운 대상 을 만 들 고 변 수 는 대상 의 인용 을 바 꾸 어 새로운 대상 을 가리 키 며 오래된 대상 은 쓰레기 로 회수 된다.
가 변 대상

변 경 된 것 은:원래 대상 의 내용 은 새로운 대상 을 만 들 지 않 고 변 수 는 원래 대상 을 가리 키 는 것 입 니 다.
코드 각도 에서 차이 점 을 보다.
가 변 대상-정형

a = 123
b = a
print(id(a))
print(id(b))
print(a, b)

a += 2

print(id(a))
print(id(b))
print(a, b)


#     
4473956912
4473956912
123 123
4473956976
4473956912
125 123

이전 두 번 의 인쇄 를 통 해 알 수 있 듯 이 a,b 변수 가 저장 한 메모리 주 소 는 같 습 니 다.그들 은 모두 123 의 메모리 주소(123 대상 의 참조)를 저장 합 니 다.
예상 상황:a 가 덧셈 할당 연산 을 한 후에 그들 은 처음에 같은 메모리 주 소 를 가리 키 고 이치 에 따라 123 을 수정 한 후에 도 같은 메모리 주 소 를 가리 키 지만 그렇지 않 습 니 다!
실제 상황:a 는 새로운 메모리 주 소 를 가리 키 고 b 는 오래된 메모리 주 소 를 가리 키 기 때문에 그들의 값 도 다르다. 
아래 그림 을 보 실 수 있 습 니 다.
우선,이것 은 메모리 영역 입 니 다.

의 원리
숫자(int,float)는 가 변 대상 이 아니 기 때문에 123 메모리 주소 에서 데 이 터 를 직접 수정 할 수 없습니다.
덧셈 값 은 실제 적 으로 원래 의 123 을 새로운 메모리 주소 로 복사 한 다음 에 덧셈 을 해서 새로운 값 125 를 얻 었 습 니 다.마지막 으로 a 는 새로운 메모리 주 소 를 가리 키 고 있 습 니 다.
가 변 대상-문자열

a = "test"
b = a
print(id(a))
print(id(b))
print(a, b)

a += "123"

print(id(a))
print(id(b))
print(a, b)


#     
4455345392
4455345392
test test
4455818288
4455345392
test123 test

불가 변 대상-원조

a = (1, 2, 3)
b = a
print(id(a))
print(id(b))
print(a, b)

a = a + a
print(id(a))
print(id(b))
print(a, b)


#     
4455410240
4455410240
(1, 2, 3) (1, 2, 3)
4455359200
4455410240
(1, 2, 3, 1, 2, 3) (1, 2, 3)

가 변 개체 목록

#   
a = [1, 2, 3]
b = a

print(id(a))
print(id(b))
print(a, b)

a += [4, 5, 6]

print(a, b)
print(id(a))
print(id(b))


#     
4327665856
4327665856
[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6]
4327665856
4327665856

a 변수 가 값 을 수정 하 는 것 을 볼 수 있 고 b 의 값 도 이에 따라 수정 되 었 습 니 다.
아래 그림 을 보 실 수 있 습 니 다.
 
list 는 가 변 대상 이 아니 기 때문에 원래 의 값 을 새로운 메모리 주소 로 복사 하지 않 고 원래 의 메모리 주소 에서 데 이 터 를 직접 수정 합 니 다.
a,b 는 모두 원래 의 메모리 주 소 를 가리 키 기 때문에 a,b 변수 가 저장 한 메모리 주 소 는 일치 합 니 다(대상 참조 가 일치 합 니 다).물론 값 도 같 습 니 다. 
Python 함수 의 매개 변수 전달
여기 서 먼저 함수 의 입문 을 미리 말씀 드 리 겠 습 니 다.매개 변수 전달 이 매우 중요 한 점 이기 때 문 입 니 다.
콘 셉 트
처음에 말 했 듯 이 Python 의 모든 전달 은 대상 의 인용 이 고 함수 매개 변수 전달 도 예외 가 아니다.
함수 에 전 달 된 변 수 는 변수 가 저 장 된 대상 참조(변수 가 가리 키 는 메모리 주소)입 니 다.
함수 내부 에서 변 수 를 수정 할 때 변수 가 가리 키 는 메모리 주소 에 따라 해당 하 는 값 을 수정 해 야 합 니 다.사실 입 니까?
매개 변수 전달 불가 변 대상

#   
def test_no_define(age, name):
    age = 123
    name = "poloyy"
    print(age, name)


age = 1
name = "yy"
print(age, name)

test_no_define(age, name)
print(age, name)


#     
1 yy
123 poloyy
1 yy

매개 변수 전달 가 변 대상

#   
def test_define(dicts, sets):
    dicts['age'] = 24
    sets.pop()
    print(dicts, sets)


dicts = {"age": 123}
sets = {1, 2}
print(dicts, sets)

test_define(dicts, sets)
print(dicts, sets)


#     
1 yy
{'age': 123} {1, 2}
{'age': 24} {2}
{'age': 24} {2}

총결산
함수 매개 변수 가 전달 하 는 변수 가 변 하지 않 는 대상 일 때 함수 내 에서 변수 값 을 바 꾸 고 함수 밖의 변 수 는 이에 따라 변 하지 않 습 니 다.
함수 매개 변수 가 전달 하 는 변수 가 가 변 대상 일 때 함수 내 에서 변수 값 을 바 꾸 면 함수 밖의 변 수 는 이에 따라 달라 집 니 다.
파 이 썬 의 가 변 적 이 고 가 변 적 이지 않 은 대상 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 가 변 적 이 고 가 변 적 이지 않 은 대상 에 관 한 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기