Python 함수 에서 매개 변 수 는 전달 값 입 니까?인용 상세 설명 입 니까?

C/C++에서 전송 값 과 전송 인용 은 함수 매개 변수 가 전달 하 는 두 가지 방식 으로 Python 에서 매개 변 수 는 어떻게 전달 합 니까?이 문제 에 대답 하기 전에 먼저 두 단락 의 코드 를 보 는 것 이 낫다.
코드 세그먼트 1:

def foo(arg):
arg = 2
print(arg)
a = 1
foo(a) #   :2
print(a) #   :1
코드 세그먼트 1 을 본 학생 들 은 매개 변수 가 값 전달 이 라 고 말 할 수 있 습 니 다.
코드 세그먼트 2:

def bar(args):
args.append(1)
b = []
print(b)#   :[]
print(id(b)) #   :4324106952
bar(b)
print(b) #   :[1]
print(id(b)) #   :4324106952
코드 세그먼트 2 를 보 았 을 때 누군가가'매개 변 수 는 전달 인용'이 라 고 말 할 수 있 습 니 다.그러면 문제 가 생 겼 습 니 다.매개 변 수 는 전달 값 입 니까?전달 인용 입 니까?아니면 둘 다 아 닙 니까?이 문 제 를 분명하게 하기 위해 서 는 먼저 Python 의 변수 와 대상 간 의 관 계 를 알 아 보 세 요.
변수 와 대상
Python 에 서 는 모든 것 이 대상 이 고 숫자 는 대상 이 며 목록 은 대상 이 며 함수 도 대상 이 며 모든 것 이 대상 입 니 다.변 수 는 대상 의 인용(이름 이나 태그 라 고도 함)이 고 대상 의 작업 은 모두 인용 을 통 해 이 루어 집 니 다.예 를 들 어[]는 빈 목록 대상 이 고 변수 a 는 이 대상 의 참조 입 니 다.

a = []
a.append(1)
Python 에서'변수'는'이름'이 라 고 부 릅 니 다.할당 작업=하나의 이름 을 대상 에 연결 하 는 것 입 니 다.대상 에 게 탭 을 추가 하 는 것 과 같다.a = 1
정수 1 할당 변수 a 는 정수 1 에 a 탭 을 연결 한 것 과 같 습 니 다.a = 2
정수 2 할당 변수 a 는 원래 정수 1 에 있 는 a 라벨 을 떼 어 내 정수 2 에 붙 이 는 것 과 같다.b = a
변수 a 를 다른 변수 b 에 할당 하 는 것 은 대상 2 에 a,b 두 개의 탭 을 붙 인 것 과 같 습 니 다.이 두 변 수 를 통 해 대상 2 를 조작 할 수 있 습 니 다.
변수 자체 에 유형 정보 가 없고 유형 정 보 는 대상 에 저 장 됩 니 다.이것 은 C/C++의 변수 와 매우 큰 차이 가 있 습 니 다.(C 의 변 수 는 메모리 영역 입 니 다)
함수 매개 변수
Python 함수 에서 매개 변수의 전달 은 본질 적 으로 할당 작업 이 고 할당 작업 은 이름 이 대상 에 연결 되 는 과정 입 니 다.할당 과 매개 변수 전달 의 본질 을 알 게 된 후에 앞의 두 단계 코드 를 분석 하 겠 습 니 다.

def foo(arg):
arg = 2
print(arg)
a = 1
foo(a) #   :2
print(a) #   :1

코드 세그먼트 1 에서 변수 a 는 1 을 연결 하고 함수 foo(a)를 호출 할 때 매개 변수 arg 에 값 을 부여 하 는 arg=1 에 해당 합 니 다.이때 두 변 수 는 모두 1 을 연결 합 니 다.함수 에서 arg 를 다시 2 로 할당 한 후,1 의 arg 라벨 을 찢 어 2 에 붙 이 는 것 과 같 으 며,1 의 다른 라벨 a 는 계속 존재 합 니 다.그래서 print(a)는 1 입 니 다.
코드 세그먼트 2 다시 볼 게 요.

def bar(args):
args.append(1)
b = []
print(b)#   :[]
print(id(b)) #   :4324106952
bar(b)
print(b) #   :[1]
print(id(b)) #   :4324106952

append 방법 을 실행 하기 전에 b 와 arg 는 같은 대상 을 가리 키 고 append 방법 을 실행 할 때 값 을 다시 부여 하지 않 았 으 며 새로운 바 인 딩 과정 도 없 었 습 니 다.append 방법 은 목록 대상 에 하나의 요 소 를 삽입 할 뿐 대상 은 그 대상 입 니 다.대상 안의 내용 만 바 뀌 었 습 니 다.b 와 arg 는 모두 같은 대상 에 연결 되 어 있 기 때문에 b.append 또는 arg.append 방법 을 실행 하 는 것 은 본질 적 으로 같은 대상 을 조작 하 는 것 이기 때문에 b 의 내용 은 함 수 를 호출 한 후에 변화 가 생 겼 습 니 다(그러나 id 는 변 하지 않 았 습 니 다.원래 의 대상 입 니 다)
마지막 으로 문제 자체 로 돌아 가 전달 값 일 까,인용 일 까?전송 값 이나 인용 이 정확 하지 않다 고 합 니 다.굳이 정확 한 이름 을 붙 여야 한다 면 전송 대상(call by object)이 라 고 합 니 다.면접 관 으로서 후보자 가 파 이 썬 함수 파라미터 전달 에 대한 파악 여 부 를 굳이 살 펴 봐 야 한다 면 글자 그대로 의 뜻 을 논의 하기 보 다 는 실제 코드 를 제시 하 는 것 이 낫다.
show me the code

def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
이 코드 는 초보 자 들 이 가장 쉽게 범 하 는 오류 로 가 변(mutable)대상 을 매개 변수 로 하 는 기본 값 입 니 다.함수 정의 후 기본 매개 변수 alist 는 빈 목록 대상 을 가리 키 며 함 수 를 호출 할 때마다 같은 대상 에 게 append 작업 을 합 니 다.따라서 이렇게 쓰 면 잠재 적 인 bug 가 있 고 같은 호출 방식 으로 다른 결 과 를 되 돌려 줍 니 다.

>>> print bad_append('one')
['one']
>>> print bad_append('one')
['one', 'one']

정확 한 방법 은 인자 의 기본 값 을 None 로 지정 하 는 것 입 니 다.

def good_append(new_item, a_list=None):
if a_list is None:
a_list = []
a_list.append(new_item)
return a_list

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기