python 초보 자 학습 가 변 및 불가 변 대상

python 에는 가 변 대상 과 가 변 대상 이 있 습 니 다.가 변 대상:list,dict.가 변 대상 은 int,string,float,tuple 입 니 다.
python 가 변 대상

int,string,float,tuple
예 를 들 어 보 겠 습 니 다.

def int_test(): 
 i = 77
 j = 77
 print(id(77))     #140396579590760
 print('i id:' + str(id(i)))  #i id:140396579590760
 print('j id:' + str(id(j)))  #j id:140396579590760
 print i is j     #True
 j = j + 1
 print('new i id:' + str(id(i))) #new i id:140396579590760
 print('new j id:' + str(id(j))) #new j id:140396579590736
 print i is j     #False
 
if __name__ == '__main__':
 int_test()
i 와 j 두 변수의 값 은 77 입 니 다.77 의 ID 와 변 수 를 인쇄 하면 j 가 메모리 에 있 는 id 가 모두 같은 메모 리 를 가리 키 는 것 을 알 수 있 습 니 다.그 러 니까 i 와 j 는 모두 같은 대상 을 가리 키 는 거 야.그 다음 에 우 리 는 j 의 값 을 수정 하여 j 의 값+1.이치 에 따라 j 가 수정 한 후에 i 의 값 도 바 뀌 어야 한다.왜냐하면 그들 은 모두 같은 메모 리 를 가리 키 지만 결 과 는 그렇지 않 기 때문이다.int 형식 은 가 변 적 이지 않 은 형식 이기 때문에 모든 것 은 j 가 새로운 메모리 주소 로 복사 한 다음+1 한 다음 에 j 가 새로운 주 소 를 가리 키 는 것 입 니 다.그래서 j 의 메모리 id 가 바 뀌 었 습 니 다.
메모리 할당 상황 은 다음 과 같 습 니 다.

i 와 j 두 변수의 값 은 77 입 니 다.77 의 ID 와 변 수 를 인쇄 하면 j 가 메모리 에 있 는 id 가 모두 같은 메모 리 를 가리 키 는 것 을 알 수 있 습 니 다.그 러 니까 i 와 j 는 모두 같은 대상 을 가리 키 는 거 야.그 다음 에 우 리 는 j 의 값 을 수정 하여 j 의 값+1.이치 에 따라 j 가 수정 한 후에 i 의 값 도 바 뀌 어야 한다.왜냐하면 그들 은 모두 같은 메모 리 를 가리 키 지만 결 과 는 그렇지 않 기 때문이다.int 형식 은 가 변 적 이지 않 은 형식 이기 때문에 모든 것 은 j 가 새로운 메모리 주소 로 복사 한 다음+1 한 다음 에 j 가 새로운 주 소 를 가리 키 는 것 입 니 다.그래서 j 의 메모리 id 가 바 뀌 었 습 니 다.
메모리 할당 상황 은 다음 과 같 습 니 다.

def dict_test():
 a = {}
 b = a
 print(id(a))
 a['a'] = 'hhhh'
 print('id a:' + str(id(a)))
 print('a:' + str(a))
 print('id b:' + str(id(b)))
 print('b:' + str(b))if __name__ == '__main__':
 dict_test()
실행 결 과 는 다음 과 같 습 니 다.
140367329543360
id a:140367329543360
a:{'a': 'hhhh'}
id b:140367329543360
b:{'a': 'hhhh'}
a 최초의 메모리 주소 id 는 140367329543360 이 고 a 를 b 에 게 할당 하 는 것 은 변수 b 도 a 가 가리 키 는 메모리 공간 을 가리 키 는 것 입 니 다.그 다음 에 우 리 는 a 가 변화 한 후에 b 도 이에 따라 변화 가 생 겼 다 는 것 을 알 게 되 었 다.list 는 가 변 형식 이기 때문에 다시 바 꾸 지 않 고 a 가 가리 키 는 메모리 공간 에서 데 이 터 를 직접 수정 하 는 것 이다.b 도 이 메모리 공간 을 가리 키 는 것 이 고 자 연 스 럽 게 b 도 이에 따라 바 뀌 었 다.
메모리 변 화 는 다음 과 같 습 니 다.

python 함수 의 매개 변수 전달
python 에서 규정 한 매개 변수 전달 은 모두 전달 인용,즉 함수 에 전달 되 는 것 은 원 변수 가 실제 가리 키 는 메모리 공간 이기 때문에 수정 할 때 이 인용 방향 에 따라 이 메모리 의 내용 을 수정 하기 때문에 이치 에 따라 우리 가 함수 내 에서 전달 한 매개 변수의 값 을 바 꾸 면 원래 외부의 변수 도 영향 을 받 아야 한다.
그러나 위 에서 python 에 가 변 유형 과 가 변 유형 이 있다 고 말 했 습 니 다.그러면 가 변 유형(list,dict)이 전 달 될 때 함수 내부 에서 수정 하면 함수 외부 변수 에 영향 을 줄 수 있 습 니 다.그러나 들 어 오 는 것 은 가 변 적 이지 않 은 형식 일 때 함수 내부 에서 변 경 량 을 수정 하 는 것 은 함수 외부 변수 에 영향 을 주지 않 습 니 다.수정 할 때 한 부 를 복사 하고 수정 하기 때 문 입 니 다.다음은 코드 를 통 해 증명 하 겠 습 니 다.

def test(a_int, b_list):
 a_int = a_int + 1
 b_list.append('13')
 print('inner a_int:' + str(a_int))
 print('inner b_list:' + str(b_list))
if __name__ == '__main__':
 a_int = 5
 b_list = [10, 11]
 test(a_int, b_list)
 print('outer a_int:' + str(a_int))
 print('outer b_list:' + str(b_list))
실행 결 과 는 다음 과 같 습 니 다.

inner a_int:6
inner b_list:[10, 11, '13']
outer a_int:5
outer b_list:[10, 11, '13']
답 은 뻔 하 다.test()방법 을 수정 한 후에 전 달 된 int 유형의 외부 변 수 는 변 하지 않 았 고 list 라 는 가 변 유형 은 test()방법의 영향 으로 내용 이 바 뀌 었 다.
요약:
많은 다른 언어 에서 파 라 메 터 를 전달 할 때 프로그래머 가 값 전달 을 선택 할 수 있 습 니까?아니면 인용 전달 을 선택 할 수 있 습 니까?(예 를 들 어 c 언어 에*번 전달 지침 은 인용 전달 이 고 직접 전달 변수 이름 은 값 전달 입 니 다)python 에서 인용 전달 만 허용 하 는 것 은 메모리 관 리 를 편리 하 게 하기 위 한 것 이 라 고 합 니 다.python 에서 사용 하 는 메모리 회수 체 제 는 카운터 회수 이기 때 문 입 니 다.즉,모든 메모리 에 하나의 카운터 가 있 는데 현재 몇 개의 대상 이 이 메모 리 를 가리 키 고 있 는 지 표시 합 니 다.변수 가 더 이상 사용 되 지 않 을 때마다 이 카운터-1,새로운 대상 이 이 메모 리 를 가리 킬 때 카운터+1,타이머 가 0 일 때 이 메모 리 를 회수 할 수 있 습 니 다.
지식 포인트 확장:
Python 가 변 대상 과 가 변 대상 원리 분석
의 원리
가 변 대상:list dict set
가 변 대상:tuple string int float bool
1.python 은 프로그래머 가 전송 값 을 사용 할 지 인용 을 사용 할 지 선택 할 수 없습니다.Python 매개 변수 전달 은'전송 대상 참조'방식 을 사용 할 것 입 니 다.실제로 이런 방식 은 전 치 와 전 인용 의 종합 에 해당 한다.함수 가 가 변 대상 의 인용 을 받 으 면 대상 의 원시 값 을 수정 할 수 있 습 니 다.'인용 전달'을 통 해 대상 을 전달 하 는 것 과 같 습 니 다.만약 함수 가 가 변 적 이지 않 은 대상 의 인용 을 받 았 다 면 원시 대상 을 직접 수정 할 수 없다―'전달 값'을 통 해 대상 을 전달 하 는 것 과 같다.
2.사람들 이 가 변 대상 을 복사 할 때 가 변 대상 의 인용 을 복사 하고 인용 값 을 바 꾸 면 원본 인 자 를 수정 합 니 다.
3.메모리 관 리 를 간소화 하기 위해 Python 은 인용 계수 체 제 를 통 해 자동 쓰레기 회수 기능 을 실현 합 니 다.Python 의 모든 대상 은 하나의 인용 수 를 가지 고 이 대상 이 서로 다른 장소 에서 각각 몇 번 인용 되 었 는 지 계산 합 니 다.파 이 썬 대상 을 한 번 인용 할 때마다 해당 인용 수 는 1 증가 하고,파 이 썬 대상 을 한 번 없 앨 때마다 해당 인용 은 1 감소 하 며,인용 계수 가 0 일 때 만 메모리 에서 파 이 썬 대상 을 삭제 합 니 다.
python 초보 자 학습 가 변 적 이 고 가 변 적 이지 않 은 대상 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 python 가 변 적 대상 과 가 변 적 이지 않 은 대상 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기