首页 >后端开发 >Python教程 >为什么嵌套 Python 函数在执行时而不是定义时访问变量?

为什么嵌套 Python 函数在执行时而不是定义时访问变量?

Patricia Arquette
Patricia Arquette原创
2024-12-24 13:27:30885浏览

Why Do Nested Python Functions Access Variables at Execution Time, Not Definition Time?

嵌套函数和局部变量访问

在Python中,嵌套函数可以从其封闭范围访问局部变量。但是,此访问的时间可能违反直觉。

考虑以下代码片段:

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()

输出显示“Mary pets”,而不是获得 Mary 抚摸每只动物的预期输出猫”代表所有三种动物。出现这种现象是因为嵌套函数 pet_function 在执行时查找局部变量cage,而不是在定义时查找。

调用函数 get_petters 时,局部变量cage 会依次分配给每个动物循环内。然而,在函数结束时,cage 包含最后一个值('cat')。当调用 get_petters 返回的函数时,它们都访问同一个值为“cat”的笼子变量。

要解决这个问题,可以使用不同的技术,例如:

  • 使用带有绑定笼的部分函数变量:

    from functools import partial
    
    def pet_function(cage):
      print "Mary pets the " + cage.animal + "."
    
    yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
  • 为嵌套函数创建新作用域:

    def scoped_cage(cage):
      def pet_function():
          print "Mary pets the " + cage.animal + "."
      return pet_function
    
    yield (animal, partial(gotimes, scoped_cage(cage)))
  • 将变量绑定为 a 的默认值关键字参数:

    def pet_function(cage=cage):
      print "Mary pets the " + cage.animal + "."
    
    yield (animal, partial(gotimes, pet_function))

以上是为什么嵌套 Python 函数在执行时而不是定义时访问变量?的详细内容。更多信息请关注PHP中文网其他相关文章!

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