大家好我无法弄清楚为什么在调用find_average()
时,全局范围内的total = 20
被用于find_total()
函数,而不是total = 10
in封闭范围?
提前感谢任何见解和帮助!
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 :(得分:1)
每个功能都有自己的范围。它从函数local,inner scope开始,然后通过封闭函数向外扩展,直到达到全局(模块)范围。此序列取决于中定义的函数的范围。堆栈(调用序列)不用于变量查找。
在您的示例中,每个函数的内部作用域后跟外部作用域。对于find_total
,即<module>.find_total.<locals>
和<module>
。因此,每当运行find_total
时,它将在其本地范围内查找total
,失败并查看全局范围。那里,total == 20
。
find_average
内的范围仅限于find_average
。全局范围find_total
或find_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
无法访问!