嵌套函数和局部变量访问
在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中文网其他相关文章!