Python 闭包是否需要外部作用域超出作用域(即结束)



正如这个 SO 答案中所解释的A closure occurs when a function has access to a local variable from an enclosing scope that has finished its execution.据我了解,函数范围在返回时已完成。一些关于python闭包的书总是有关于闭包的例子,这些例子定义了一个嵌套函数,并在末尾返回它以表示外部作用域的结束。如拉马略的Fluent Python

def make_averager():
series = []
def averager(new_value):
series.append(new_value)
total = sum(series)
return total/len(series)
return averager

卢巴诺维奇的书Introducing Python

def knights2(saying):
def inner2():
return "We are the knights who say: '%s'" % saying
return inner2

然后我偶然发现了布雷特·斯拉特金(Brett Slatkin(Effective Python的书。他的关闭示例:

def sort_priority(values, group):
def helper(x):
if x in group:
return (0, x)
return (1, x)
values.sort(key=helper)
numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}
sort_priority(numbers, group)

布雷特说,闭包发生在helper功能中。helpervalues.sort(key=helper)里面被叫来了.据我了解,当sort_priority到达values.sort(key=helper)行时,范围并没有结束。为什么他说这里会发生关闭?

我只想知道布雷特例子的闭包方面。我已经知道/理解sort_priorityhelper的工作原理

皮尔逊在这里提供了本书的样本页。幸运的是,示例页面具有我提到的部分。这是Item 15: Know How Closures Interact with Variable Scope

我了解,sort_priority的范围并没有在它 到达线路values.sort(key=helper).他为什么说关闭 发生在这里?

假设这不是一个彻头彻尾的错误,Slatkin一定使用了不同的"关闭"定义。 由于提供的代码是一个示例,我认为它附带一个定义,您应该仔细将其与您引用的代码进行比较。

我想 Slatkin 的想法围绕着helper()当它被values.sort()调用时能够访问周围上下文的group变量,而该变量不在范围内。 这至少类似于闭包的传统定义 - 该函数具有引用属于其定义上下文的数据的能力。 我不认为我会同意它完全符合通常的闭包标准,但不要让这分散你对 Slatkin 试图教授的技术本质的注意力。

最新更新