python 은 두 변수 값 을 교환 하 는 n 가지 조작 을 실현 합 니 다.
방법 1:
c = 0
c= a
a= b
b= c
방법 2:
a,b = b,a
python 의 기본 방법 입 니 다.방법 3:(두 변수 로 만 구현)
a = a+b
b = a-b
a = a-b
python 두 수치 교환(a,b=b,a 원리 분석)python 교환 두 가지 가치 있 는 방법 은 매우 간단 합 니 다.즉,a,b=b,a 입 니 다.한 단계 조작 으로 두 개의 값 을 교환 하 였 습 니 다.그러면 이것 은 왜 일 까요?
진실:
Python 의 변 수 는 값 을 직접 저장 하지 않 고 메모리 주 소 를 참조 하 며 변 수 를 교환 할 때 인 용 된 주소 만 교환 합 니 다.
다음 절 차 를 먼저 보 세 요.
import dis
def func(a,b):
a,b=b,a
print(a,b)
a=10
b=20
func(a,b)
dis.dis(func)
일반적으로 하나의 Python 문 구 는 몇 개의 바이트 코드 명령 에 대응 합 니 다.Python 의 바이트 코드 는 어 셈 블 리 명령 과 유사 한 중간 언어 입 니 다.그러나 하나의 바이트 코드 명령 은 하나의 기계 명령(바 이 너 리 명령)에 대응 하 는 것 이 아니 라 C 코드 에 대응 하 는 것 입 니 다.서로 다른 명령 의 성능 이 다 르 기 때문에 명령 수량 을 통 해 코드 의 성능 을 판단 할 수 없습니다.비교적 잦 은 명령 을 호출 하 는 코드 를 통 해 프로그램의 성능 을 확인 해 야 한다.하나의 Python 프로그램 은 몇 개의 코드 블록 으로 구성 되 어 있 습 니 다.예 를 들 어 하나의 Python 파일 은 하나의 코드 블록,하나의 클래스,하나의 함수 가 하나의 코드 블록 이 고 하나의 코드 블록 은 실행 되 는 문맥 환경 과 일련의 바이트 코드 명령 에 대응 합 니 다.
dis 의 역할
dis 모듈 은 주로 바이트 코드 를 분석 하 는 내장 모듈 로 자주 사용 되 는 방법 은 dis.dis([by tesource])이 고 매개 변 수 는 코드 블록 으로 이 코드 블록 에 대응 하 는 바이트 코드 명령 서열 을 얻 을 수 있 습 니 다.
코드 출력 결과
그 중에서 앞 에 12 인 결과 만 보면 됩 니 다.
주로 ROT 임 을 알 수 있 습 니 다.TWO 명령 의 공로:
python 문 서 를 보면 ROT 가 있 음 을 알 수 있 습 니 다.TWO(원본 1398 줄),ROTTHREE(원본 1406 줄),ROTFOUR 라 는 명령 은 직접
두 변수,세 변수,네 변수의 값 을 교환 합 니 다.
python 3.4 의 원본 코드 에서 ceval.c 파일 을 찾 아 보면 다음 과 같 습 니 다.
TARGET(ROT_TWO) {
PyObject *top = TOP();
PyObject *second = SECOND();
SET_TOP(second);
SET_SECOND(top);
FAST_DISPATCH();
}
TARGET(ROT_THREE) {
PyObject *top = TOP();
PyObject *third = THIRD();
SET_SECOND(third);
FAST_DISPATCH();
}
첨부:python 값 교환변수의 모든 초기 화 는 새로운 공간 을 열 어 새로운 내용 의 주 소 를 변수 에 할당 합 니 다.다음 그림 에서 우리 가 반복 하 는 str1 에 값 을 부여 합 니 다.사실은 메모리 에서 의 변 화 는 그림 과 같 습 니 다.
위의 그림 에서 알 수 있 듯 이 str 1 은 중복 초기 화 과정 에서 str 1 에 저 장 된 요소 주소 가'hello World'의 주소 에서'new hello World'로 바 뀌 었 기 때문이다.
복잡 한 데이터 형식 에 있어 내부 의 값 이 변수 에 미 치 는 영향 을 바 꿉 니 다.
목록 에 있 는 요 소 를 추가 삭제 하고 수정 할 때 lst 1 목록 자체 가 전체 목록 주소 에 영향 을 주지 않 고 내부 요소 의 주소 참조 만 변경 합 니 다.
그러나 목록 을 다시 초기 화(할당)할 때 lst 1 이라는 변수 에 주 소 를 다시 부여 하고 원래 목록 의 주 소 를 덮어 씁 니 다.이때 lst 1 목록 의 메모리 id 가 바 뀌 었 습 니 다.위의 이 이 치 는 모든 복잡 한 데이터 형식 에 사용 되 는 것 이 똑같다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.