Python 패키지 의 두 가지 주의사항(추천)
쉽게 말 하면 패 킷 을 닫 는 것 은 서로 다른 설정 정보 에 따라 서로 다른 결 과 를 얻 는 것 이다.
다시 한 번 전문 적 인 해석 을 살 펴 보 자.폐쇄(Closure)는 품사 폐쇄(Lexical Closure)의 약칭 으로 자유 변 수 를 인용 한 함수 이다.이 인 용 된 자유 변 수 는 이 함수 와 함께 존재 할 것 이 며,이미 그것 을 만 드 는 환경 에서 벗 어 났 더 라 도 예외 가 아니다.그래서 폐쇄 는 함수 와 관련 된 인용 환경 으로 구 성 된 실체 라 는 또 다른 주장 이 있다.
지연 바 인 딩
Python 패키지 함수 가 인용 한 외부 자유 변 수 는 연결 지연 입 니 다.
Python
In [2]: def multipliers():
...: return [lambda x: i * x for i in range(4)]
In [3]: print [m(2) for m in multipliers()]
[6, 6, 6, 6]
In [2]: def multipliers():
...: return [lambda x: i * x for i in range(4)]
In [3]: print [m(2) for m in multipliers()]
[6, 6, 6, 6]
상기 코드:i 는 패키지 함수 가 인용 한 외부 작용 역 의 자유 변수 로 내부 함수 가 호출 될 때 만 변수 i 의 값 을 검색 할 수 있 습 니 다.순환 이 끝 났 기 때문에 i 는 최종 값 3 을 가리 키 기 때문에 각 함수 호출 은 같은 결 과 를 얻 었 습 니 다.해결 방법:
1)패 킷 함 수 를 생 성 할 때 즉시 바 인 딩(함수 형 인삼 의 기본 값 사용):
Python
In [5]: def multipliers():
return [lambda x, i=i: i* x for i in range(4)]
...:
In [6]: print [m(2) for m in multipliers()]
[0, 2, 4, 6]
In [5]: def multipliers():
return [lambda x, i=i: i* x for i in range(4)]
...:
In [6]: print [m(2) for m in multipliers()]
[0, 2, 4, 6]
상기 코드:패 킷 함 수 를 생 성 할 때 모든 패 킷 함수 에 기본 값 을 가 진 매개 변 수 를 볼 수 있 습 니 다.i=i,이때 해석 기 는 i 의 값 을 찾 고 이 를 형 삼 i 에 부여 합 니 다.이렇게 하면 패 킷 함 수 를 생 성 하 는 외부 역할 영역(즉 외부 순환 에서)에서 변수 i 를 찾 아 현재 값 을 형 삼 i 에 부여 합 니 다.2)funtools.partial 사용:
Python
In [26]: def multipliers():
return [functools.partial(lambda i, x: x * i, i) for i in range(4)]
....:
In [27]: print [m(2) for m in multipliers()]
[0, 2, 4, 6]
In [26]: def multipliers():
return [functools.partial(lambda i, x: x * i, i) for i in range(4)]
....:
In [27]: print [m(2) for m in multipliers()]
[0, 2, 4, 6]
상기 코드:연결 지연 으로 인해 문제 가 생 길 수 있 을 때 funtools.partial 구조 편향 함 수 를 통 해 자유 변 수 를 폐쇄 함수 에 우선 연결 할 수 있 습 니 다.패키지 함수 에서 인 용 된 자유 변 수 를 다시 연결 하 는 것 을 금지 합 니 다.
Python
def foo(func):
free_value = 8
def _wrapper(*args, **kwargs):
old_free_value = free_value # free_value
free_value = old_free_value * 2 # free_value
func(*args, **kwargs)
free_value = old_free_value
return _wrapper
def foo(func):
free_value = 8
def _wrapper(*args, **kwargs):
old_free_value = free_value # free_value
free_value = old_free_value * 2 # free_value
func(*args, **kwargs)
free_value = old_free_value
return _wrapper
이상 코드 가 잘못 보 고 됩 니 다.Unbound LocalError:local variable'freevalue'referenced before assignment,상기 코드 는 초기 화 상태(freevalue)그러나 내부 패 킷 함 수 를 실행 할 때 필요 에 따라 새로운 상 태 를 변화 시 킬 수 있 습 니 다(freevalue = old_free_value*2)의 장식 기,내부 에 재 귀속 이 발생 하여 해석 기 는 freevalue 는 국부 변수 로 간주,oldfree_value = free_value 는 잘못 보고 합 니 다.해석 기 는 freevalue 는 할당 없 이 인용 되 었 습 니 다.해결:
패키지 함수 가 인용 한 자유 변 수 를 수정 하려 고 할 때 list 에 넣 으 면 freevalue = [8], free_value 는 수정 할 수 없 지만 freevalue[0]는 안전하게 수 정 될 수 있 습 니 다.
또한 Python 3.x 는 nonlocal 키 워드 를 추가 하여 이 문 제 를 해결 할 수 있 습 니 다.
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 Python 클 로 징 의 두 가지 주의사항 입 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.