2016-07-11 293 views
0

嗨,大家好我不知道爲什麼當調用find_average()時,total = 20在全局範圍內被用於find_total()函數,而不是total = 10在封閉範圍內? 在此先感謝您的任何見解和幫助!封閉本地範圍變量與全局範圍變量 - Python

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

total = 10創建一個新變量,它只在'find_avarage'中可見,而不在函數中調用 – Jens

+0

它應該是一個數字列表 –

回答

0

每個函數都有自己的範圍。它從函數local,inner scope開始,然後通過封閉函數向外傳遞,直到達到全局(模塊)範圍。該順序取決於在中定義的功能的範圍。堆棧(調用序列)是而不是用於變量查找。

在你的例子中,每個函數只有內部作用域,後面跟着外部作用域。對於find_total,即<module>.find_total.<locals><module>。因此,無論何時運行find_total,它都會在其本地範圍內查找total,失敗並查看全局範圍。那裏,total == 20

find_average內的範圍是find_average的唯一因素。全局範圍find_totalfind_length都不能訪問它。如果您想要將find_average中的內容傳遞給find_total,則應該通過參數傳遞內容。


可選地,如果find_total可以內部find_average定義。這樣,find_total通過搜索序列<module>.find_average.<locals>.find_total.<locals> -> <module>.find_average.<locals> -> <module>來解析名稱。

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) 

這將使find_total人跡罕至從外部find_average

+0

啊!所以我誤解了調用序列(正如你所提到的)決定了函數的範圍。相反,它是由函數定義的位置決定的,例如,如果'find_total'是在'find_average'內定義的。我對麼? –