封闭的局部范围中的变量与全局范围中的变量 - Python

时间:2016-07-11 12:40:54

标签: python scope nested global local

大家好我无法弄清楚为什么在调用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)

1 个答案:

答案 0 :(得分:1)

每个功能都有自己的范围。它从函数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 无法访问