嵌套函数中的局部变量
这个复杂的示例涉及嵌套函数和闭包,这可能会导致令人困惑的行为。让我们揭开谜底。
嵌套函数执行
嵌套函数在执行时会访问父作用域中的变量。在本例中,pet_function 是 get_petters 生成器中的嵌套函数。执行时,它会在 get_petters 范围内搜索变量。
闭包单元和局部变量
pet_function 有一个自由变量(笼子)。在编译期间,这个自由变量由闭包单元表示。当执行 pet_function 时,此闭包单元会检查 get_petters 周围范围内的 cage 值。
动态查找和闭包
当 funs 列表时,会出现有问题的行为被创建。此时,get_petters 中的 cage 的值为“cat”。当调用 funs 中的每个函数时,pet_function 中的闭包单元会在该函数调用时查找 cage 的值,而不是在定义它时。
访问不同的动物
为了解决此问题,pet_function 需要访问每个动物的笼子对象的特定实例。这可以通过部分函数、新函数作用域或关键字参数来实现。
部分函数
部分函数创建一个具有固定参数的新函数。以下是使用 functools.partial() 的示例:
def pet_function(cage=None): print("Mary pets the " + cage.animal + ".") yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
新函数作用域
创建新函数作用域可确保笼变量绑定在新定义的范围内函数。
def scoped_cage(cage=None): def pet_function(): print("Mary pets the " + cage.animal + ".") return pet_function yield (animal, partial(gotimes, scoped_cage(cage)))
关键字参数
绑定cage变量作为关键字参数的默认值:
def pet_function(cage=cage): print("Mary pets the " + cage.animal + ".") yield (animal, partial(gotimes, pet_function))
以上是Python 中的嵌套函数如何处理局部变量和闭包?的详细内容。更多信息请关注PHP中文网其他相关文章!