2016-07-11 243 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'内定义的。我对么? –