<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 閱讀(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實現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/


    主站蜘蛛池模板: 美女视频黄的全免费视频| 十八禁视频在线观看免费无码无遮挡骂过 | 日本牲交大片免费观看| 91天堂素人精品系列全集亚洲 | 亚洲国产精品久久久久秋霞小| 精品一区二区三区免费毛片爱| 亚洲爆乳精品无码一区二区三区| 国产福利在线观看永久免费| 亚洲综合色丁香麻豆| 亚洲人成网站在线在线观看| 最近最好的中文字幕2019免费| 学生妹亚洲一区二区| 午夜无遮挡羞羞漫画免费| 亚洲精品第一国产综合亚AV| 国产精品极品美女免费观看| 精品特级一级毛片免费观看| 国产精品亚洲高清一区二区| 热99RE久久精品这里都是精品免费 | 色综合久久精品亚洲国产| 国产一区二区三区免费看| xxxxx做受大片视频免费| 亚洲人成人77777网站| 久操免费在线观看| ww亚洲ww在线观看国产| 国产一级高清视频免费看| 精选影视免费在线 | 亚洲av日韩av高潮潮喷无码| 18禁亚洲深夜福利人口| 亚洲国产综合久久天堂| 成人爽a毛片免费| 亚洲另类古典武侠| 免费无遮挡无码永久在线观看视频| av成人免费电影| 亚洲综合在线成人一区| 国产免费久久精品久久久| 日本三级在线观看免费| 亚洲永久在线观看| 亚洲日韩一页精品发布| a毛片基地免费全部视频| 日韩毛片一区视频免费| 亚洲欧洲国产综合|