对于python 作用域新的理解
生活随笔
收集整理的這篇文章主要介紹了
对于python 作用域新的理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天看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
總結
以上是生活随笔為你收集整理的对于python 作用域新的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享一个百度云加速下载工具
- 下一篇: 安利一款编辑神器——Markdown