<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Python中inner function的binding處理

    Posted on 2008-10-17 20:06 ZelluX 閱讀(508) 評論(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實現closure的方式和常見的functional language不同,采用了flat closures實現。

    “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函數x += 1對x進行賦值,rebind了這個對象,于是Python查找x的時候只會在local environment中搜索,于是就有了UnboundLocalError。

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

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

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

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

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

    參考網站:http://www.python.org/dev/peps/pep-0227/


    主站蜘蛛池模板: 亚洲VA成无码人在线观看天堂| 亚洲一区在线免费观看| 四虎永久在线精品免费观看地址| 精品亚洲成在人线AV无码| www视频在线观看免费| 亚洲日韩中文字幕| 国产又大又粗又长免费视频 | 亚洲人精品亚洲人成在线| 美女网站免费福利视频| 国产精品亚洲精品观看不卡| 免费看片在线观看| 亚洲综合无码一区二区痴汉| 免费视频中文字幕| 337p日本欧洲亚洲大胆人人| 波多野结衣久久高清免费| 国产亚洲美女精品久久久久| 亚洲精品无码av天堂| a色毛片免费视频| 久久精品亚洲中文字幕无码麻豆 | 亚洲人成片在线观看| 成人免费无码大片A毛片抽搐色欲| 亚洲精品人成网线在线播放va| 国产麻豆一精品一AV一免费| 亚洲精品高清久久| 成人性生活免费视频| 永久免费无码日韩视频| 亚洲国产精品久久久天堂| 亚洲免费观看在线视频| 亚洲精品无码av片| 亚洲免费观看视频| 久久久久久久久免费看无码| 国产成人亚洲午夜电影| 亚洲国产成人精品无码区在线观看| 99在线观看视频免费| 亚洲欧美日韩中文二区| 丁香五月亚洲综合深深爱| 草久免费在线观看网站| 亚洲综合婷婷久久| 无码国模国产在线观看免费| 国产午夜精品理论片免费观看| 亚洲一区动漫卡通在线播放|