"최소 놀라움"과 변경 가능한 기본 인수
Python의 변경 가능한 기본 인수 동작은 오랫동안 초보자와 숙련된 개발자 모두를 당황하게 했습니다. foo(a=[])와 같은 함수는 여러 호출에 걸쳐 예기치 않게 값을 누적하므로 많은 사람들이 그 이론적 근거에 의문을 제기합니다.
결함이 있어 보이는 이 설계의 근본 원인을 이해하려면 Python 함수의 본질을 탐구해야 합니다. 일류 개체로. 함수가 정의되면 본질적으로 객체 자체로 평가됩니다. 이는 예제에서 a=[]와 같은 기본 매개변수가 함수 객체의 속성이 된다는 것을 의미합니다.
따라서 함수가 호출될 때 평가되는 것은 기본 매개변수 값이 아니라 함수 정의 시 생성된 목록 개체를 가리키는 속성입니다. 결과적으로 함수 내의 목록에 대한 모든 수정 사항은 공유 참조에 영향을 미치며 a의 누적 동작을 설명합니다.
이 접근 방식은 일관성과 객체 준수를 우선시하는 Python의 "최소 경악" 철학에 부합합니다. 지향적인 원칙. 클래스의 인스턴스 변수가 시간이 지남에 따라 변경될 수 있는 것처럼 함수 개체의 이 "멤버 데이터"도 변경될 수 있습니다.
이 동작은 실용적인 목적으로도 사용됩니다. 이를 통해 함수가 호출 전반에 걸쳐 지속되는 상태를 가질 수 있습니다. 다음 예를 고려하십시오.
def a(): print("a executed") return [] def b(x=a()): x.append(5) print(x) a executed >>> b() [5] >>> b() [5, 5]
여기서 a()에서 반환된 값은 b()에 대한 모든 호출에서 공유되므로 여러 반복에 걸쳐 목록을 수정하고 유지할 수 있습니다. 함수 실행 시 기본 인수를 바인딩하면 b()가 호출될 때마다 효과적으로 새 목록이 생성되므로 이 동작이 불가능해집니다.
결론적으로, Python의 변경 가능한 기본 인수 동작은 처음에는 직관에 어긋나는 것처럼 보일 수 있지만, 그 이유는 다음과 같습니다. 언어의 일류 기능 특성을 가지며 객체 지향 프로그래밍 및 일관성 원칙과 일치합니다.
위 내용은 Python의 변경 가능한 기본 인수 동작이 예기치 않은 누적으로 이어지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!