>백엔드 개발 >파이썬 튜토리얼 >Python의 변경 가능한 기본 인수 동작이 예기치 않은 누적으로 이어지는 이유는 무엇입니까?

Python의 변경 가능한 기본 인수 동작이 예기치 않은 누적으로 이어지는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-22 15:42:16557검색

Why Does Python's Mutable Default Argument Behavior Lead to Unexpected Accumulation?

"최소 놀라움"과 변경 가능한 기본 인수

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.