함수값 전달 문제

먼저 예를 살펴보겠습니다.

# -*- coding: UTF-8 -*-
def chagne_number( b ):
    b = 1000
b = 1
chagne_number(b)
print( b )

최종 출력 결과는 다음과 같습니다.

1

여기 있는 일부 사람들은 질문이 있을 수 있습니다. 왜 b 값이 chagne_number 함수를 통해 변경되지 않습니까? 왜 변화가 없고 출력 결과가 여전히 1입니까? 이 문제는 많은 프로그래밍 언어에서 논의되며 원리에 대한 설명은 비슷합니다.

이것은 주로 유형 객체인 함수 매개변수의 전송에 관한 것입니다. Python의 기본 데이터 유형도 이전에 소개되었습니다. 이러한 유형 객체는 변경 가능한 유형과 변경 불가능한 유형으로 나눌 수 있습니다. Python에서는 문자열, 정수, 부동 소수점 유형, 튜플이 변경 불가능한 객체인 반면 목록, 딕셔너리 등은 변경 가능한 객체입니다.

예:

변경할 수 없는 유형

: 변수 할당 a = 1은 실제로 정수 개체 1을 생성하고 변수 a는 1을 가리킵니다. a = 1000인 경우 실제로 다른 정수 개체 1000을 생성한 다음 변수를 변경합니다. a의 값은 더 이상 정수 객체 1을 가리키지 않고 1000을 가리키며 마지막 1은 삭제됩니다

변경 가능한 유형

: 변수 할당 a = [1,2,3,4,5,6 ], 즉 객체 목록을 생성하는 경우 목록에 6개의 요소가 있고 변수 a는 목록을 가리키며 a[2] = 5는 목록 a의 세 번째 요소의 값을 변경합니다. 위의 항목을 리디렉션하지 않고 목록의 요소 값을 직접 수정합니다.

ca71dacdee25f4d37deb9d0275fb3ba.png이는 함수의 매개변수 전달에도 영향을 미칩니다.

불변 유형

: 정수, 문자열, 튜플과 같은 C++와 유사한 값 전달. 예를 들어 fun(a)는 a의 값만 전송하고 a 객체 자체에는 영향을 주지 않습니다. 예를 들어, 내부 fun(a)의 값을 수정하면 복사된 다른 객체만 수정되고 객체 자체에는 영향을 주지 않습니다.

변경 가능한 유형

: 목록 및 사전과 같은 C++ 참조 전달과 유사합니다. 예를 들어 fun(a)에는 실제로 a가 전달됩니다. 수정 후에는 외부 fun도 영향을 받습니다. 따라서 첫 번째 예에서는 b = 1인 정수 객체가 생성되고 변수 b는 다음을 가리킵니다. 이 객체를 얻은 후 chagne_number 함수를 전달하면 변수 b가 값으로 복사됩니다. 전달되는 것은 b의 값일 뿐이며 b 자체에는 영향을 미치지 않습니다. 자세한 내용은 수정된 예시를 보시고 인쇄된 결과를 통해 더 잘 이해하실 수 있습니다.

# -*- coding: UTF-8 -*-
def chagne_number( b ):
    print('函数中一开始 b 的值:{}' .format( b ) )
    b = 1000
    print('函数中 b 赋值后的值:{}' .format( b ) )
b = 1
chagne_number( b )
print( '最后输出 b 的值:{}' .format( b )  )
인쇄 결과:

函数中一开始 b 的值:1
函数中 b 赋值后的值:1000
最后输出 b 的值:1

물론 매개변수가 변경 가능한 유형인 경우 이 함수를 호출한 후에는 원래 값도 변경됩니다. 구체적인 예는 다음과 같습니다.

# -*- coding: UTF-8 -*-
def chagne_list( b ):
    print('函数中一开始 b 的值:{}' .format( b ) )
    b.append(1000)
    print('函数中 b 赋值后的值:{}' .format( b ) )
b = [1,2,3,4,5]
chagne_list( b )
print( '最后输出 b 的值:{}' .format( b )  )

출력 결과:

函数中一开始 b 的值:[1, 2, 3, 4, 5]
函数中 b 赋值后的值:[1, 2, 3, 4, 5, 1000]
最后输出 b 的值:[1, 2, 3, 4, 5, 1000]
지속적인 학습
  • 코스 추천
  • 코스웨어 다운로드
현재 코스웨어를 다운로드할 수 없습니다. 현재 직원들이 정리하고 있습니다. 앞으로도 본 강좌에 많은 관심 부탁드립니다~