2017-01-21 1 views
0

다음 코드를 Python3.4에서 실행하려고하는데 오류가 발생합니다.함수 내 함수에서 변수에 액세스하는 방법

def checknumner(): 
    i = 0 
    print("checknumber called...") 
    def is_even(): 
     print("is_even called...") 
     global i 
     if i % 2 == 0: 
      print("Even: ", i) 
     else: 
      print("Odd: ", i) 
     i += 1 
    return is_even 

c = checknumner() 
print(c()) 
print(c()) 
print(c()) 

하위 기능에서 변수 "i"에 액세스 할 수 없습니다.

내가 주석 때 "내가 전역"

D:\Study\Python>python generator_without_generator.py checknumber called... is_even called... Traceback (most recent call last): File "generator_without_generator.py", line 24, in <module> 
    print(c()) File "generator_without_generator.py", line 16, in is_even 
    if i % 2 == 0: UnboundLocalError: local variable 'i' referenced before assignment 

내가 추가 한 Statment는 "전 세계"한 Statment는

D:\Study\Python>python generator_without_generator.py checknumber called... is_even called... Traceback (most recent call last): File "generator_without_generator.py", line 24, in <module> 
    print(c()) File "generator_without_generator.py", line 16, in is_even 
    if i % 2 == 0: NameError: name 'i' is not defined 

사람이 설명해 주시겠습니까?

답변

3

파이썬 3 사용하는 경우이 문제를 해결하기 위해 놀라운 방법이, (당신이 좋아 보이는) : 그것은 정의 한 것처럼 여기

def function(): 
    i = 0 
    def another_function(): 
     nonlocal i 
     # use 'i' here 

i 글로벌 아니다 외부 모두 기능입니다. 또한 외부에 정의 된대로 another_function에 국지적이지 않습니다. 따라서 로컬이 아닌 인 경우입니다.

+0

왜'에서 필요한 모든 nonlocal'입니다 : 약 nonlocal

더 많은 정보? 귀하의 예에서도, 이것은 단지 클로저입니다. 즉 내부 함수가 외부 함수에 정의 된 변수에 액세스 할 수 있습니다. –

+0

편집 : 그것은 참조 오류를 일으키는'i + = 1' 라인입니다. 그러나, 주어진 코드로 반복적 인 호출에서도'i'는 결코 증가하지 않으며,'i'는 여전히 클로저 범위를 통해 접근 할 수 있습니다. –

+1

@Vincenzzzochi "I"값이 증가하고 nonlocal을 사용하면 완벽하게 작동합니다. – n33rma

관련 문제