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

封闭局部范围中的变量与全局范围中的变量-Python,python,scope,nested,global,local,Python,Scope,Nested,Global,Local,大家好,我不明白为什么在调用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_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
,它都将在其本地范围内查找
total
,失败,并在全局范围内查找。这里,
total==20

find_average
内的范围是
find_average
的专有范围。全局范围、
find_total
find_length
都无法访问它。如果要将某个内容从内部
find_average
传递到
find_total
,则应通过参数进行传递


或者,如果可以在
find_average
中定义
find_total
。这样,
find\u total
通过搜索序列
.find\u average..find\u total.->来解析名称。找到平均值。->


这将使
find_total
无法从外部访问
find_average

示例列表的内容是什么?total=10创建了一个新变量,该变量仅在
find\u avarage
中可见,而不在从ITIT调用的函数中可见,它应该是numbers@Jens
find_average
不被认为是
find_total
的封闭范围吗?据我所知,python在局部范围内查找变量定义,如果它不存在,则查找变量的封闭范围。这是正确的还是我弄错了?谢谢
find_total
的封闭范围是模块。范围是由定义范围定义的,而不是调用范围。啊!所以我误解了调用序列(正如您所提到的)决定了函数的作用域。相反,它取决于函数的定义位置,例如,如果在
find\u average
中定义了
find\u total
。我说得对吗?
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)