2010-05-22 4 views
2

그래서 지금 당장 이상한 오류가 발생합니다. 나는 그것이 일어나는 곳을 발견했고, 그것을 재현 할 수있는 가장 간단한 코드가있다.변수에 _assigning_ 할 때 파이썬 범위 문제가 발생했습니다.

def cause_an_error(): 
    some_var = False 
    def some_nested_func(): 
     print some_var 
     #some_var = True 
    some_nested_func() 

>>> cause_an_error() 
False 

"그대로"실행하면 "거짓"이 인쇄됩니다. 당신이 행의 주석을 해제한다면, 그것은 오류가 있습니다 : 오류가 전에 잘 작동 라인에서 발생

Traceback (most recent call last): 
    File "<pyshell#224>", line 1, in <module> 
    cause_an_error() 
    File "<pyshell#223>", line 6, in cause_an_error 
    some_nested_func() 
    File "<pyshell#223>", line 4, in some_nested_func 
    print some_var 
UnboundLocalError: local variable 'some_var' referenced before assignment 

알 수 있습니다.

어떤 아이디어가 원인이고 어떻게 해결할 수 있습니까? Python 2.6.1을 사용하고 있습니다.

+0

://stackoverflow.com/questions/2516652/scoping-problem-in-recursive-closure –

답변

1

내부 함수 some_nest_func에는 자체 범위가 있으며 해당 범위 내의 some_var에 할당한다는 사실은 some_var을 해당 범위에 대해 로컬로 만듭니다. 이것은 바깥 쪽 기능에 할당 된 some_var을 숨기는 효과가 있습니다. 그것들은 두 개의 다른 변수입니다.

위의 결과는 사용자가 할당하기 전에 some_nest_func의 버전이 some_var 인 것을 인쇄한다는 것입니다.

내부 함수 내부와 외부의 변수를 조작해야하는 경우, AFAIK에 대한 명확한 방법은 없습니다. 간단한 해결 방법은 변수를 단일 요소 배열로 바꾸고이를 조작하는 것입니다 (물론 배열 변수에 할당하지 마십시오).

+0

저에게 의미가 있습니다. 그러나 비 로컬 변수가 할당 후에 만 ​​섀도 잉되어서는 안됩니까? – Ponkadoodle

+1

섀도 잉은 컴파일 할 때 발생합니다. 파이썬이 범위 내의 아무 곳이나 할당을 찾으면 모든 참조가 로컬이됩니다. –

+0

Hrmm. 그렇다면이 문제를 어떻게 해결할 수 있습니까? – Ponkadoodle

1

코드를 리팩터링하지 않고도 2.x에서 수정할 수 없습니다. 3.x는 이것을 해결하기 위해 nonlocal을 추가합니다.

0

당신은 추한 있지만, (an answer to a similar question로부터 전사)이 솔루션은 작동합니다, 같은 딕셔너리와 같은 참조 (가변 읽기) 변수의 값을 변경하여이 작업을 수행 할 수 있습니다

이 HTTP와 매우 유사
def avoid_an_error(): 
    D = {"some_var": False} 
    def some_nested_func(): 
     D["some_var"] = True 
     print D["some_var"] 
    some_nested_func() 

>>> avoid_an_error() 
True 
관련 문제