让人做网站需要注意什,主要搜索引擎网站搜索结果比较,wordpress 旋转加载,用dw做网站怎么做出下拉菜单今天看Python习题#xff0c;看到如下题目 def num():return [lambda x: i*x for i in range(4)]
print([m(2) for m in num()]) # 求输出结果是什么 我看了半天才明白这应该是一个列表生成式#xff0c;列表中的元素为四个匿名函数#xff0c;我本以为每个匿名函数应该是…今天看Python习题看到如下题目 def num():return [lambda x: i*x for i in range(4)]
print([m(2) for m in num()]) # 求输出结果是什么 我看了半天才明白这应该是一个列表生成式列表中的元素为四个匿名函数我本以为每个匿名函数应该是不一样的因为他们的 i 不一样所以应该返回的结果也会不同。可当我在命令行输出测试后才发现完全不是这么回事啊下面是输出结果 [6, 6, 6, 6] # 是真的6啊 后来去网上搜索了一下才知道原来是作用域的问题看来我Python作用域没有学好啊这个匿名函数中的作用域和外层的循环作用域是不同的匿名函数的引用了外层作用域变量 i 当匿名函数被调用时会输出 i * x但是 i 在匿名函数的作用域中是不存在的所有只能想外层作用域寻找也就是for循环的作用域但是此时循环早就已经结束了i 也不再是当时生成该匿名的 i 了现在的 i 已经是循环到最后一层固定不变的 i 了也就是 i 3, 所有匿名函数中的返回值就都是一样的了即 3 * x。 如果还是不懂可以将生成式转换为普通函数。如下 def num():L []for i in range(4):def lambda_(x):return i * x # 该作用域内没有 i 变量需要找寻上层作用域的 i 变量L.append(lambda_) # 追加进列表的函数他们的返回值是 i * x,并不是0x,1x,2x,3x,变量还处于引用关系阶段return Llambda_list num()L []
for lambda_ in lambda_list:result lambda_(2)L.append(result)print(L) python 的作用域都有legb规则即Local,Enclose,Global,Builtin作用域的查找顺序是从内向外的。 转载于:https://www.cnblogs.com/welisit/p/10656905.html