python开发应用程序错误_Python 程序员经常犯的 10 个错误
常見錯(cuò)誤 #6: 不明白Python在閉包中是如何綁定變量的
看下面這個(gè)例子:
>>> def create_multipliers():
... return [lambda x : i * x for i in range(5)]
>>> for multiplier in create_multipliers():
... print multiplier(2)
...
你也許希望獲得下面的輸出結(jié)果:
0
2
4
6
8
但實(shí)際的結(jié)果卻是:
8
8
8
8
8
驚訝吧!
這之所以會(huì)發(fā)生是由于Python中的“后期綁定”行為——閉包中用到的變量只有在函數(shù)被調(diào)用的時(shí)候才會(huì)被賦值。所以,在上面的代碼中,任何時(shí)候,當(dāng)返回的函數(shù)被調(diào)用時(shí),Python會(huì)在該函數(shù)被調(diào)用時(shí)的作用域中查找 i 對(duì)應(yīng)的值(這時(shí),循環(huán)已經(jīng)結(jié)束,所以 i 被賦上了最終的值——4)。
解決的方法有一點(diǎn)hack的味道:
>>> def create_multipliers():
... return [lambda x, i=i : i * x for i in range(5)]
...
>>> for multiplier in create_multipliers():
... print multiplier(2)
...
0
2
4
6
8
在這里,我們利用了默認(rèn)參數(shù)來生成一個(gè)匿名的函數(shù)以便實(shí)現(xiàn)我們想要的結(jié)果。有人說這個(gè)方法很巧妙,有人說它難以理解,還有人討厭這種做法。但是,如果你是一個(gè) Python 開發(fā)者,理解這種行為很重要。
總結(jié)
以上是生活随笔為你收集整理的python开发应用程序错误_Python 程序员经常犯的 10 个错误的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 月入不足万元不缴纳个税是真的吗?可免汇算
- 下一篇: 消费行业包括哪些?这些都属于消费行业!