python 변수의 저장 원리 에 대한 상세 한 설명

변수의 저장 소
고급 언어 에서 변 수 는 메모리 와 주소 에 대한 추상 적 인 것 이다.
python 의 경우 python 의 모든 변 수 는 대상 이 고 변수의 저장 은 의 미 를 참조 하 는 방식 으로 변수의 값 이 있 는 메모리 주소 일 뿐 이 변수의 자체 가 아 닙 니 다.
인용 의미:python 에서 변 수 는 대상(값)의 인용 을 저장 합 니 다.우 리 는 인용 의미 라 고 합 니 다.이러한 방식 을 사용 하면 변수 에 필요 한 저장 공간 크기 가 일치 합 니 다.변 수 는 인용 만 저장 하기 때 문 입 니 다.대상 의 의미 와 지침 의 의미 라 고도 불 린 다.
값 의미:일부 언어 는 이런 방식 을 사용 하지 않 습 니 다.그들 은 변수의 값 을 변수의 저장 소 에 직접 저장 합 니 다.이런 방식 은 우리 에 게 값 의미 라 고 부 릅 니 다.예 를 들 어 C 언어 는 이런 저장 방식 을 사용 합 니 다.모든 변수 가 메모리 에서 차지 하 는 공간 은 변 량 의 실제 크기 에 따라 정 해 져 야 하고 고정 할 수 없습니다.
python 의 변 수 는 모두 인용 의 미 를 사용 하기 때문에 데이터 구 조 는 기본 데이터 형식 을 포함 할 수 있 기 때문에 python 의 모든 변수 에 이 변수의 주 소 를 저장 합 니 다.값 자체 가 아 닙 니 다.
복잡 한 데이터 구조 에 있어 그 안에 저 장 된 것 도 모든 요소 의 주소 일 뿐 입 니 다.다음은 기본 유형 과 데이터 구조 유형 변수 가 다시 할당 하 는 저장 변 화 를 보 여 줍 니 다.
1.데이터 형식 이 python 의미 참조 에 미 치 는 영향 을 다시 초기 화 합 니 다.
변수의 모든 초기 화 는 새로운 공간 을 열 어 새로운 내용 의 주 소 를 변수 에 할당 합 니 다.다음 그림 에서 볼 때 우 리 는 str1 에 값 을 부여 하 는 것 을 반복 합 니 다.사실은 메모리 에서 의 변 화 는 다음 과 같 습 니 다.오른쪽 그림:


위의 그림 에서 알 수 있 듯 이 str 1 은 중복 초기 화 과정 에서 str 1 에 저 장 된 요소 주소 가'hello World'의 주소 에서'new hello World'로 바 뀌 었 기 때문이다.
2.데이터 구조 내부 요소 변화 가 python 의미 참조 에 미 친 영향
복잡 한 데이터 형식 에 있어 내부 의 값 이 변수 에 미 치 는 영향 을 바 꿉 니 다.


목록 에 있 는 요 소 를 추가 삭제 하고 수정 할 때 lst 1 목록 자체 가 전체 목록 주소 에 영향 을 주지 않 고 내부 요소 의 주소 참조 만 변경 합 니 다.그러나 목록 을 다시 초기 화(할당)할 때 lst 1 이라는 변수 에 주 소 를 다시 부여 하고 원래 목록 의 주 소 를 덮어 씁 니 다.이때 lst 1 목록 의 메모리 id 가 바 뀌 었 습 니 다.위의 이 이 치 는 모든 복잡 한 데이터 형식 에 사용 되 는 것 이 똑같다.
변수 할당
1.str 의 할당


str 1 의 재 초기 화(할당)는 메모리 주소 의 변 화 를 초래 할 수 있다 는 것 을 방금 알 았 습 니 다.위의 그림 에서 str 1 을 수정 한 후에 할당 된 str 2 는 메모리 주소 부터 값 까지 영향 을 받 지 않 았 음 을 알 수 있 습 니 다.
메모리 의 변 화 를 보면 시작 하 는 할당 작업 은 str 1 과 str 2 변 수 를 모두'hello World'가 있 는 주 소 를 저장 하고 str 1 을 초기 화하 여 str 1 에 저 장 된 주 소 를 바 꾸 었 습 니 다.이 때 str 2 변 수 는 저 장 된 메모리 주 소 를 바 꾸 지 않 았 기 때문에 영향 을 받 지 않 습 니 다.
2.복잡 한 데이터 구조 에서 의 할당
방금 우 리 는 간단 한 데이터 형식의 할당 값 을 보 았 는데,지금 은 복잡 한 데이터 구조 변화 가 메모리 에 미 치 는 영향 을 살 펴 보 았 다.


위의 그림 은 목록 에 대한 추가 수정 작업 입 니 다.목록 의 메모리 주 소 를 바 꾸 지 않 았 습 니 다.lst 1 과 lst 2 가 모두 변 했 습 니 다.
메모리 그림 을 비교 해 보면 목록 에 새 값 을 추가 할 때 목록 에 새로운 요소 의 주 소 를 하나 더 저장 하고 목록 자체 의 주 소 는 변 하지 않 았 기 때문에 lst 1 과 lst 2 의 id 는 변 하지 않 았 고 모두 새로운 요 소 를 추가 했다.
간단하게 비유 하면 우 리 는 밥 을 먹 으 러 나 간다.lst 1 과 lst 2 는 마치 짝 꿍 이 밥 을 먹 는 두 사람 처럼 두 사람 이 한 테이블 을 함께 사용한다.테이블 이 변 하지 않 으 면 테이블 위의 요리 가 달라 진다.두 사람 은 공통 적 으로 느낀다.
얕 은 복사
우선 얕 은 복사 본 에 대해 알 아 보 겠 습 니 다.얕 은 복사:아무리 복잡 한 데이터 구조 라 도 얕 은 복사 본 은 한 층 만 복사 합 니 다.다음은 그림 한 장 을 보고 얕 은 카피 의 개념 을 알 아 보 자.


위의 두 장의 그림 을 보면,우리 가 왼쪽 그림 을 넣 은 것 은 하나의 목록 을 나타 낸다.

sourcelist,sourcelist = ['str1','str2','str3','str4','str5',['str1','str2','str3','str4','str5']];
오른쪽 그림 은 원래 의 기초 위 에서 얕 은 카피 의 copylist 가 하나 더 나 왔 는데,

copylist = ['str1','str2','str3','str4','str5',['str1','str2','str3','str4','str5']];
sourcelist 와 copylist 는 겉으로 보기 에는 똑 같 지만 실제로 메모리 에 새 목록 이 생 성 되 었 습 니 다.copy 는 sourceLst 를 생 성하 여 새 목록 을 얻 었 습 니 다.5 개의 문자열 과 목록 이 있 는 메모리 의 주 소 를 저장 합 니 다.
우 리 는 아래 에서 각각 두 개의 목록 을 조작 하 는 것 을 보 았 습 니 다.빨간색 상자 안 은 변수 초기 화 이 고 위의 두 개의 목록 을 초기 화 했 습 니 다.우 리 는 각각 이 두 목록 을 조작 할 수 있 습 니 다.예 를 들 어 하나의 값 을 삽입 하면 우 리 는 무엇 을 발견 할 수 있 습 니까?다음 과 같다.

위의 코드 를 통 해 알 수 있 듯 이 sourceLst 와 copyLst 목록 에 하나의 요 소 를 추가 합 니 다.이 두 목록 은 마치 독립 된 것 처럼 각각 변화 가 생 겼 습 니 다.그러나 제 가 lst 를 수정 할 때 이 두 목록 은 모두 변화 가 생 겼 습 니 다.이것 은 왜 일 까요?메모리 의 변화 도 를 살 펴 보 겠 습 니 다.

sourceLst 와 copyLst 목록 에 주 소 를 저장 하고 있 음 을 알 수 있 습 니 다.sourceLst 1 요 소 를 수정 할 때'sourceChange'의 주소 로 원래'str 1'의 주 소 를 교체 하 는 것 과 같 아서 sourceLst 의 첫 번 째 요소 가 변 했 습 니 다.copyLst 는 str 1 의 주 소 를 저장 하기 때문에 copyLst 는 변 하지 않 습 니 다.
sourceLst 목록 이 바 뀌 었 을 때 copyLst 에 저 장 된 lst 메모리 주 소 는 바 뀌 지 않 았 기 때문에 lst 가 바 뀌 었 을 때 sourceLst 와 copyLst 두 목록 이 모두 바 뀌 었 습 니 다.
이러한 상황 은 사전 세트 사전,목록 세트 사전,사전 세트 목록,목록 세트 목록,그리고 각종 복잡 한 데이터 구조의 내장 에서 발생 하기 때문에 우리 의 데이터 형식 이 매우 복잡 할 때 copy 로 얕 은 복사 를 하 는 것 은 매우 조심해 야 한다.
딥 카피
딥 복사-즉 python 의 copy 모듈 이 제공 하 는 또 다른 deepcopy 방법 입 니 다.깊이 복사 하면 원 변수 와 관련 된 모든 데 이 터 를 완전히 복사 하고 메모리 에서 똑 같은 내용 을 생 성 합 니 다.이 과정 에서 우 리 는 이 두 변수 중 하 나 를 임의로 수정 해도 다른 변수 에 영향 을 주지 않 습 니 다.다음은 우리 가 한번 시험 해 보 자.

위의 실행 결 과 를 보면 이번 에는 목록 을 직접 조작 하 든 목록 에 포 함 된 다른 데이터 구조 작업 을 하 든 복사 한 목록 이 영향 을 받 지 않 습 니 다.우 리 는 이 변수 들 이 메모리 에 있 는 상황 을 다시 한번 봅 시다.

위의 내용 을 보고 우 리 는 깊 은 복사 의 원 리 를 알 게 되 었 다.사실 딥 복사 란 메모리 에 공간 을 다시 만 드 는 것 이다.데이터 구조 가 아무리 복잡 하 더 라 도 변 경 될 수 있 는 데이터 형식 이 있 으 면 메모리 공간 을 다시 열 어 내용 을 마지막 층 까지 복사 하고 복잡 한 데이터 형식 이 없 으 면 원래 의 인용 을 유지 하 는 것 이다.이렇게 되면 데이터 구조 가 아무리 복잡 해도 데이터 간 의 수정 은 서로 영향 을 주지 않 는 다.이게 바로 딥 카피 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기