首页 >后端开发 >Python教程 >为什么我的嵌套函数只能访问其父函数中局部变量的最终值?

为什么我的嵌套函数只能访问其父函数中局部变量的最终值?

Barbara Streisand
Barbara Streisand原创
2024-12-16 12:49:14474浏览

Why Does My Nested Function Only Access the Final Value of a Local Variable in Its Parent Function?

嵌套函数中的局部变量

嵌套函数提供了一种在父函数中封装特定功能的便捷方法。然而,它们的闭包行为可能会在局部变量的可访问性和值方面引入一些复杂性。

问题:

考虑以下代码片段:

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的正确值:

  • 部分函数: 利用 functools.partial 创建一个具有固定值的新函数。
  • 作用域函数: 在循环中创建一个新函数,以确保每个函数都有唯一的作用域pet_function 的实例。
  • 默认参数值: 将笼子作为默认参数值传递给pet_function.

通过采用其中一种方法,您可以确保嵌套函数在每次迭代时访问预期的局部变量。

以上是为什么我的嵌套函数只能访问其父函数中局部变量的最终值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn