一行简短的代码怎么也看不懂

JingleJin 发布于 2016/09/19 18:39
阅读 288
收藏 0

li = [lambda:x for x in range(10)]
res = li[0]()
print(res) #输出为9



第一行代码我实在是读不懂啊!为什么li[1]()、li[2]()等都返回9?

谁能详细解释这个代码?

加载中
1
Kinegratii
Kinegratii

代码等效于

li = []
for x in range(10):
    def _x():
        return x
    li.append(_x)

print(li[0]())



用到了闭包,Python的闭包是迟绑定的。原文是

Python’s closures are late binding. This means that the values of variables used in closures are looked up at the time the inner function is called.
即:闭包中变量的值只有在内部函数被调用时才会进行查询

print一行才调用内部_x函数,而循环已结束,x = 9

0
大止刀口
大止刀口

应该是由于lambda捕获的是x的引用,所以生成的li(一个10个lambda表达式的列表)的所有lambda实际上都引用了同一个值,也就是x,由于最后被赋值为9(由于for x in range(10)这句),所以所有lambda都返回9。


0
大止刀口
大止刀口

python里的lambda是捕获引用的,例如:

>>> x = 234
>>> f = lambda:print(x)
>>> f()
234
>>> x = 456
>>> f()
456



0
J
JingleJin

引用来自“Kinegratii”的评论

代码等效于

li = []
for x in range(10):
    def _x():
        return x
    li.append(_x)

print(li[0]())



用到了闭包,Python的闭包是迟绑定的。原文是

Python’s closures are late binding. This means that the values of variables used in closures are looked up at the time the inner function is called.
即:闭包中变量的值只有在内部函数被调用时才会进行查询

print一行才调用内部_x函数,而循环已结束,x = 9

这样讲就理解了,谢谢
返回顶部
顶部