루프의 함수 및 람다 생성 이상
아래 코드 조각에서 볼 수 있듯이 루프 내에서 함수를 생성하려고 하면 이상한 현상이 발생합니다. 문제가 발생합니다:
functions = [] for i in range(3): def f(): return i functions.append(f)
마찬가지로 Lambdas:
functions = [] for i in range(3): functions.append(lambda: i)
이러한 함수는 고유한 값(0, 1, 2)을 출력할 것으로 예상하지만 모든 함수는 결국 동일한 값(2)을 생성합니다.
설명 및 해결책
이 현상은 늦은 변수 바인딩으로 인해 발생합니다. Python 함수에서는 변수가 호출될 때 해결됩니다. 즉, 루프 후에 함수가 호출될 때 i 값이 이미 2로 설정되어 있습니다. 이를 수정하기 위해 f(i=i) 구문을 도입하여 초기 바인딩을 사용합니다. . 여기서 i 인수의 기본값은 정의 시점에 설정되어 초기 바인딩이 발생합니다.
def f(i=i): return i
또는 클로저와 "함수 팩토리"를 사용하는 보다 복잡한 접근 방식은 다음과 같이 조기 바인딩을 보장합니다. 음:
def make_f(i): def f(): return i return f
루프 내에서 def 문 대신 f = make_f(i)를 활용할 수 있습니다.
위 내용은 Python 루프에서 생성된 함수가 모두 동일한 값을 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!