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

Variable in enclosed local scope vs variable in global scope - Python

大家好,我不明白为什么在调用 find_average() 时,全局范围内的 total = 20 被用于 find_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)

每个函数都有自己的作用域。它从局部函数、内部作用域开始,然后通过封闭函数向外移动,直到到达全局(模块)作用域。此顺序取决于函数在 中 定义的范围。堆栈(调用序列)不是用于变量查找。

在您的示例中,每个函数只有其内部作用域和外部作用域。对于 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!