嵌套函数提供了一种在父函数中封装特定功能的便捷方法。然而,它们的闭包行为可能会在局部变量的可访问性和值方面引入一些复杂性。
问题:
考虑以下代码片段:
from functools import partial class Cage(object): def __init__(self, animal): self.animal = animal def gotimes(do_the_petting): do_the_petting() def get_petters(): for animal in ['cow', 'dog', 'cat']: cage = Cage(animal) def pet_function(): print("Mary pets the " + cage.animal + ".") yield (animal, partial(gotimes, pet_function)) funs = list(get_petters()) for name, f in funs: print(name + ":", f())
期望的行为是每次迭代打印三种不同的动物(“牛”、“狗”、“猫”)。但是,该程序仅在所有迭代中打印“cat”。这种行为与局部变量笼子与嵌套函数关联的预期相矛盾。
答案:
误解在于嵌套函数存储引用的假设定义时其父作用域的局部变量。实际上,嵌套函数仅在执行时才从父作用域查找变量。
在这个特定示例中,为 pet_function 创建的闭包从 get_petters 函数中索引了 cage 变量。当 pet_function 被调用时,它访问闭包以检索 cage 的值。然而,此时 get_petters 函数已完成,笼变量的最终值为“cat”。因此,对任何 pet_function 变体的所有后续调用都会返回值“cat”。
解决方法:
要解决此问题,可以使用各种技术来确保嵌套函数访问cage的正确值:
通过采用其中一种方法,您可以确保嵌套函数在每次迭代时访问预期的局部变量。
以上是为什么我的嵌套函数只能访问其父函数中局部变量的最终值?的详细内容。更多信息请关注PHP中文网其他相关文章!