2011-07-03 3 views
9

파이썬에서 클로저가 네임 스페이스의 변수를 조작 할 수 있는지 궁금합니다. 상태가 클로저 외부에서 변경되기 때문에이 부작용을 호출 할 수 있습니다. 이처럼 뭔가하고 싶습니다.부작용이있는 파이썬 마감

def closureMaker(): 
    x = 0 
    def closure(): 
    x+=1 
    print x 
    return closure 

a = closureMaker() 
a() 
1 
a() 
2 

분명히 내가하고 싶은 것은 더 복잡합니다. 그러나이 예는 제가 말하고자하는 것을 보여줍니다.

+0

; 이 질문은 아주 간단하고 요점과 잘 쓰여졌다. 또한 http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to-language-x-closures – ninjagecko

+0

을 참조하십시오. 두 개 이상의 질문을 병합 할 방법이 없습니까? ; p –

답변

17

정확하게 파이썬 2.x에서 그렇게 할 수는 없지만 트릭을 사용하면 같은 효과를 얻을 수 있습니다 :리스트와 같은 변경 가능한 객체를 사용하십시오.

def closureMaker(): 
    x = [0] 
    def closure(): 
     x[0] += 1 
     print x[0] 
    return closure 

명명 된 속성 또는 사전을 사용하여 객체를 만들 수도 있습니다. 특히 목록에 수정할 변수가 두 개 이상있는 경우 목록보다 읽기 쉽습니다.

파이썬 3.x에서는 내부 함수에 nonlocal x을 추가하기 만하면됩니다. 이로 인해 x에 대한 할당이 외부 범위로 이동합니다.

+0

그 이유를 설명해주십시오. 나는 이것에 대해 파이썬 문서에서 뭔가를 찾으려고 노력하고있다. –

+1

@ André : PEP 3104는 기술적 인 경우 유익합니다. http://www.python.org/dev/peps/pep-3104/ –

+0

저에게는 ** 어느 쪽이든 작동해야합니다 **. 나는 단지 [this] (http://docs.python.org/reference/executionmodel.html#naming-and-binding)을 읽었습니다. * "정의가 함수 블록에서 발생하면 범위는 그 안에 포함 된 블록으로 확장됩니다 포함 된 블록 이름 바인딩 다른 도입하지 않는 한, 하나의 정의 "는 질문에 주어진 예에서 x''에 할당 할 때 * –