【问题标题】:Variable in enclosed local scope vs variable in global scope - Python封闭局部范围内的变量与全局范围内的变量 - Python
【发布时间】:2016-11-13 09:59:29
【问题描述】:

大家好,我不明白为什么在调用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)

【问题讨论】:

  • example_list 的内容是什么?
  • total = 10 创建一个新变量,该变量仅在 find_avarage 中可见,在从它调用的函数中不可见
  • 它应该是一个数字列表
  • @Jens 不是 find_average 被认为是 find_total 的封闭范围吗?据我了解,python 在本地范围中查找变量定义,然后如果不存在,则查找变量的封闭范围。这是正确的还是我弄错了?谢谢!
  • find_total 的封闭范围是模块。范围由定义范围定义,而不是调用范围。

标签: python scope nested global local


【解决方案1】:

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

在您的示例中,每个函数只有其内部范围,然后是外部范围。对于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 访问

【讨论】:

  • 啊!所以我误解了调用序列(如你所提到的)决定了函数的范围。相反,它取决于函数的定义位置,例如,find_total 是否在 find_average 中定义。我说的对吗?
猜你喜欢
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2013-12-25
  • 1970-01-01
  • 2020-12-17
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多