<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 403, comments - 310, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Python中inner function的binding處理

    Posted on 2008-10-17 20:06 ZelluX 閱讀(517) 評論(0)  編輯  收藏 所屬分類: OOP
    BBS上的一個帖子,問題是
    def?a():
    ????
    def?b():
    ????????x?
    +=?1
    ?
    ????x?
    =?1
    ????
    print?"a:?",?x
    ????b()
    ????
    print?"b:?",?x
    ?
    def?c():
    ????
    def?d():
    ????????x[0]?
    =?[4]
    ????x?
    =?[3]
    ????
    print?"c:?",?x[0]
    ????d()
    ????
    print?"d:?",?x[0]

    運行a()會報UnboundLocalError: local variable ‘x’ referenced before assignment
    但是運行c()會正確地顯示3和4。

    原因在于原因在于CPython實現(xiàn)closure的方式和常見的functional language不同,采用了flat closures實現(xiàn)。

    “If a name is bound anywhere within a code block, all uses of the name within the block are treated as references to the current block.”

    在第一個例子中,b函數(shù)x += 1對x進行賦值,rebind了這個對象,于是Python查找x的時候只會在local environment中搜索,于是就有了UnboundLocalError。

    換句話說,如果沒有修改這個值,比如b中僅僅簡單的輸出了x,程序是可以正常運行的,因為此時搜索的范圍是nearest enclosing function region。

    而d方法并沒有rebind x變量,只是修改了x指向的對象的值而已。如果把賦值語句改成x = [4],那么結(jié)果就和原來不一樣了,因為此時發(fā)生了x的rebind。

    所以Python中的closure可以理解為是只讀的。

    另外第二個例子也是這篇文章中提到的一種workaround:把要通過inner function修改的變量包裝到數(shù)組里,然后在inner function中訪問這個數(shù)組。

    至于為什么Python中enclosed function不能修改enclosing function的binding,文中提到了主要原因還是在于Guido反對這么做。因為這樣會導(dǎo)致本應(yīng)該作為類的實例保存的對象被聲明了本地變量。

    參考網(wǎng)站:http://www.python.org/dev/peps/pep-0227/


    主站蜘蛛池模板: 亚洲AV无码专区电影在线观看| 成人免费777777| 精品国产亚洲男女在线线电影| 亚洲国产午夜精品理论片在线播放| 永久免费av无码不卡在线观看| 国产亚洲精品美女久久久| 国产99久久久国产精免费| 亚洲精品无码99在线观看| 久久久久亚洲精品无码网址| 日韩亚洲翔田千里在线| 精品国产免费观看久久久| 日韩国产精品亚洲а∨天堂免| 国产黄色片在线免费观看| 国产精品亚洲一区二区三区在线观看| 成年丰满熟妇午夜免费视频| 亚洲精品国产suv一区88| 国产精品极品美女免费观看 | 国产精品jizz在线观看免费| 国产成人精品日本亚洲语音 | 亚洲综合在线视频| 国产91色综合久久免费分享| 亚洲综合成人婷婷五月网址| 最新69国产成人精品免费视频动漫 | 国产成人精品免费视频大全| 亚洲精品中文字幕乱码三区| 人妻无码一区二区三区免费| 日本亚洲精品色婷婷在线影院| 女人张开腿给人桶免费视频| 黄色a级片免费看| 免免费国产AAAAA片| 亚洲av无码一区二区三区四区| 亚洲人成影院在线观看 | 亚洲国产成人久久笫一页 | 中文字幕成人免费视频| 色老板亚洲视频免在线观| 免费吃奶摸下激烈视频| 久久亚洲日韩看片无码| 免费无码A片一区二三区| 香蕉视频免费在线播放| 亚洲综合精品一二三区在线| 在线观看人成视频免费|