2016-07-11 4 views
0

하이 find_average()가 호출 될 때, 전역 범위에서 total = 20find_total() 기능에 사용되는 이유를 알아낼 수없는 사람, 대신에 둘러싸 범위 total = 10? 통찰력과 도움을 미리 감사드립니다!변수 - 파이썬

total = 20 

def find_total(l): 
    return total 

def find_length(l): 
    length = len(l) 
    return length 

def find_average(l): 
    total = 10 
    return find_total(l)/find_length(l) 


average = find_average(example_list) 
+0

example_list의 콘텐츠는 무엇입니까? – Jens

+1

총계 = 10은'find_avarage'에서만 호출되는 새로운 변수를 생성합니다. – Jens

+0

숫자 목록이되어야합니다. –

답변

0

각 기능마다 고유 한 범위가 있습니다. 로컬, 내부 범위의 함수에서 시작하여 전역 (모듈) 범위에 도달 할 때까지 함수를 둘러싸는쪽으로 바깥쪽으로갑니다. 이 시퀀스는 함수가 인 범위에 따라에 정의됩니다. 스택 (호출 순서)은 이 아니며 변수 조회에이 사용되지 않습니다.

예에서 각 함수는 내부 범위와 외부 범위 만 가질 수 있습니다. find_total의 경우 <module>.find_total.<locals><module>입니다. 따라서 find_total이 실행될 때마다 로컬 범위에서 total을 찾아 실패하고 전역 범위를 조사합니다. There, total == 20.

find_average의 범위는 find_average입니다. 전역 범위 (find_total 또는 find_length)도 액세스 할 수 없습니다. 내부에서 find_averagefind_total으로 전달하려면 매개 변수를 통해 전달해야합니다.


달리, find_totalfind_average 내에 정의 할 수있는 경우. 이렇게하면 find_total은 시퀀스 <module>.find_average.<locals>.find_total.<locals> -> <module>.find_average.<locals> -> <module>을 검색하여 이름을 확인합니다. 이 밖에 find_average에서 find_total액세스를 만들 것입니다

total = 20 

def find_length(l): 
    length = len(l) 
    return length 

def find_average(l): 
    total = 10 
    def find_total(l): 
    return total 
    return find_total(l)/find_length(l) 

average = find_average(example_list) 

!

+0

아! 그래서 당신이 언급 한 호출 순서가 함수의 범위를 결정한다는 사실을 오해했습니다. 오히려'find_total'가'find_average' 안에 정의되어있는 경우와 같이 함수가 어디에 정의되어 있는지에 따라 결정됩니다. 나 맞아? –