python闭包的延迟绑定_匿名函数在列表生成式中的应用产生的闭包函数延迟绑定问题...

本文探讨了Python中匿名函数在列表生成式中的应用,导致的闭包函数延迟绑定问题。通过实例展示了如何由[0, 2, 4, 6]变为[6, 6, 6, 6]的现象,并解释了闭包的延迟绑定特性。通过将匿名函数转换为普通函数,分析了闭包函数的结构,最后提出了解决这个问题的方法,即通过传递参数实现变量绑定,从而得到预期结果[0, 2, 4, 6]。
摘要由CSDN通过智能技术生成

匿名函数在列表生成式 (推导式) 中的应用产生的闭包函数延迟绑定问题

先看下面这个函数:python

def num():

return [lambda x: x * i for i in range(4)]

print([func(2) for func in num()])

再不运行结果的状况下心算下它的结果......是否是算到 [0,2,4,6] ?闭包

因而在pycharm里面运行了一下 : [6,6,6,6], 百思不得其解, 咱们先来把匿名函数变成普通函数, 这样好理解一点 :app

def num():

sub=[]

for i in range(4):

def bar(x):

return i*x

sub.append(bar)

return sub

print([func(2) for func in num()])

咱们能够看到它是一个闭包函数的结构, 看 num( ) 返回的列表里面放的应该是四个 bar 函数的内存地址 : [bar, bar, bar, bar] , 并无去调用 bar 函数函数

def num():

# 返回值是一个列表生成式, 里面存放了四个而函数对象

return [lambda x: x * i for i in range(4)]

for i in num():

print(i)

'''

.. at 0x000002AA99D2CE58>

.. at 0x000002AA99D2CDC8>

.. at 0x000002AA99EE4708>

.. at 0x000002AA99EE4D38>

'''

当执行print([func(2) for func in num()]) 的时候, 这才触发了每一个 bar 函数的执行, 此时的 for 循环已经结束了, 最终的 i = 3, 因此每次的结果都是 2*3=6code

非匿名函数解决方法

在内层函数 bar 形参位置设置一个接收 i 的参数, 让其绑定对象

def num():

sub=[]

for i in range(4):

def bar(x,n=i):

return n*x

sub.append(bar)

return sub

print([func(2) for func in num()]) # [0, 2, 4, 6]

闭包函数延迟绑定问题解释

在函数嵌套的时候, 若是一个循环返回的是一个函数对象, 该函数对象出现引用的时候并不会当即引用循环的值, 而是在运行(调用)嵌套函数的时候才会去查找该引用的值, 这个特性就是闭包函数的延迟绑定内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值