成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

關于python變量的作用域問題

瀏覽:184日期:2022-07-14 17:41:36

問題描述

有這樣一個函數:

def outside(): x=[] print(id(x)) def inside():print(id(x))x[:]=[1,2,3]print(id(x)) inside() print(id(x)) print(x)

調用后沒出現問題,輸出:140560473157960140560473157960140560473157960140560473157960[1, 2, 3]

但是將里面的x換成一個字符串,如下:

def outside(): x=’outside’ print(id(x)) def inside():print(id(x))x=’inside’print(id(x)) inside() print(id(x)) print(x)

再來進行調用的時候就變成了:

140560473762872Traceback (most recent call last): File '<stdin>', line 1, in <module> File '<stdin>', line 8, in outside File '<stdin>', line 5, in insideUnboundLocalError: local variable ’x’ referenced before assignment

按照規則,此時進入inside函數里,為什么x不指向原來的’outside’字符串了呢?

未定義的變量不是應該產生NameError嗎,為什么此處不是?

我原來以為字符串和list都是類似于C中的指針,但現在看來不是這樣,如果可以的話希望能對這一點進行一些介紹,謝謝。

問題解答

回答1:

從易到難一個個回答, 因為是個人愚見, 所以如果有大神看到說得不正確, 希望能夠指出類似C中的指針: 這個是正確的, 因為在py里面, 幾乎所有的事物都是對象, 就連變量賦值, 也是先生成對象, 再讓變量指向這個對象,而對象還分可變對象和不可變對象, 在對可變對象操作時, 是會影響到其他指向這個對象的變量, 例如:

o = [1, 2, 3, 4]b = oprint id(o)print id(b)b[1] = 123123print bprint o輸出:3994637639946376[1, 123123, 3, 4][1, 123123, 3, 4] # o指向的列表也被改變

而對于不可變對象, 是直接就放棄舊的對象, 而指向新的對象, 例如:

s = ’123123’print id(s)s = ’32131’print id(s)# 輸出:4139276841392808

所以你在操作python對象時, 需要謹記該對象是屬于哪種類型, 你的操作又會不會因為這些特性而失敗或者沒達到自己想要的效果.

未定義的變量: python在查找變量時, 將遵循LEGB的順序, 只有都查找完畢還是沒找到的情況下, 才會觸發NameError異常, 這個可以參考我的一篇博文: Python: 作用域(scope) 和 LEGB

UnboundLocalError: 這個問題是最常見, 也是最難解釋的, 因為我們總是相當然地覺得, 它必定就會根據ELGB的順序去查到變量;其實我們的理解并沒錯誤, 只是我們忽略了一點:賦值語句,如果函數代碼段沒有賦值語句, 那么這個問題是不會出現, 但為什么出現賦值語句就會報錯呢? 這和python的作用域有關, 在上面那篇文章提到, python作用域并不是動態的,而是靜態的, 從腳本文件的縮進, 就能看出來的, 所以在代碼:

x=’outside’ print(id(x)) def inside():print(id(x))x=’inside’print(id(x))

在inside中, 已經有了賦值語句, 所以對于x,他已經不會從enclosing 或者global甚至bulitin里面去查找, 它已經被認定在local域了, 只是這個值并沒有和真正的對象’inside’建立起綁定關系, 因為代碼沒有運行到真正的賦值語句, 所以, 會觸發這個UnboundLocalError. 而為什么那個列表會可以那樣做, 因為他們兩個是完全不同的操作, 同樣都是print(id(x))list的操作字節碼是LOAD_DEREF, 而字符串的操作字節碼是LOAD_FAST, 而x[:]=[1,2,3]/x=’inside’分別對應的字節碼又是STORE_SLICE+3 和 STORE_FAST, 前者是在原來的基礎上修改, 而后者是重新指向新的對象, 而這兩種方式的區別, 決定了,它們在構建函數時, 以怎樣的形式存放x, 這個就涉及到python函數構建的原理了, 有興趣可以看看源碼中的object/ceval.c源碼, 這是虛擬機運行的原理, 關于這個問題可以簡單看我另一篇文章, 比較簡單將UnboundLocalError: 說下那神奇的 UnboundLocalError: local variable x referenced before assignment

回答2:

你在inside函數里面重新賦值了新的變量x,兩個x的作用域是不相同的。而導致UnboundLocalError,是因為你在inside的作用域里面,打印了一個沒有初始化的變量。具體看這個解釋:https://docs.python.org/2/faq...

回答3:

基本上Lin_R已經說的很清楚了。outside函數與inside函數,他們的域是不同的。由于你在inside函數中對x進行了賦值,當在inside函數中使用變量x時,此時x就被認定是在inside的local域中。此時的x是不會使用其他域中的值的。所以在print(x)時,由于x沒有初始化的值,因此出錯。雖然在c中可以使用已定義而未賦值的變量,但是python不允許這種情況。

在python3中,有一個nonlocal語句可以解決這個問題。

def outside(): x=’outside’ print(id(x)) def inside():nonlocal xprint(id(x))x=’inside’print(id(x)) inside() print(id(x)) print(x)

注意,此時使用global語句是不行的,因為在global域內沒有x這個變量。

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品日本| 国产真实精品久久二三区| 麻豆精品在线看| 久久av一区| 亚洲中国最大av网站| 极品日韩久久| 国产精品国产三级国产普通话蜜臀| 97久久精品人人爽人人爽蜜臀 | 久久久久国产精品厨房| av中文字幕一区| 26uuu久久天堂性欧美| 欧美裸体bbwbbwbbw| 日韩电影在线免费观看| 在线亚洲欧美专区二区| 久久精品一二三| 成人h版在线观看| 日韩欧美美女一区二区三区| 国产69精品一区二区亚洲孕妇| 日韩欧美电影一二三| av在线不卡免费看| 国产情人综合久久777777| 欧美视频在线观看| 亚洲四区在线观看| 亚洲高清资源综合久久精品| 69av一区二区三区| 国产在线播放一区| 91精品国产综合久久久久久久 | 免费毛片一区二区三区久久久| 日韩激情av在线| 欧美激情偷拍| 欧美经典一区二区三区| 影音先锋亚洲精品| 亚洲综合一区二区精品导航| 午夜亚洲精品| 捆绑紧缚一区二区三区视频| 91精品国产综合久久久久久久| gogogo免费视频观看亚洲一| 国产精品美女www爽爽爽| 国产日韩一区二区三区| 午夜视频一区在线观看| 欧美亚日韩国产aⅴ精品中极品| 国产aⅴ精品一区二区三区色成熟| 精品久久久久一区二区国产| 黄色亚洲大片免费在线观看| 亚洲一区二区三区四区五区黄| 91国产免费观看| 国产成人亚洲综合a∨婷婷| 久久久久久一二三区| 99国产精品| 免费不卡在线视频| 精品国产污污免费网站入口 | 国产精品久久久一本精品 | 欧美少妇xxx| 国产宾馆实践打屁股91| 久久综合999| 亚洲国产精品一区| 五月综合激情日本mⅴ| 欧美日韩亚洲综合一区二区三区| 成人一二三区视频| 中文字幕在线视频一区| 蜜桃视频一区| 国产成人精品免费一区二区| 国产精品入口麻豆原神| 色哟哟国产精品| 风间由美一区二区三区在线观看| 国产精品热久久久久夜色精品三区 | 99久久久久久| 亚洲欧美一区二区三区极速播放 | 欧美一区二区三区人| 红杏aⅴ成人免费视频| 亚洲国产人成综合网站| 欧美一级理论性理论a| 黑人巨大精品欧美一区二区小视频| 亚洲福利一区二区三区| 欧美精品v国产精品v日韩精品| 欧美成人精品| 七七婷婷婷婷精品国产| 亚洲精品一区二区三区99| 中文亚洲欧美| 高清视频一区二区| 尤物av一区二区| 欧美一区二区性放荡片| 伊人久久成人| 国产一区三区三区| 亚洲欧美怡红院| 欧美午夜一区二区三区| 欧美日韩国产三区| 麻豆国产精品777777在线| 欧美激情综合五月色丁香| 91激情五月电影| 女人香蕉久久**毛片精品| 日韩福利电影在线| 久久九九影视网| 日本韩国一区二区| 欧美影视一区| 蜜臀av性久久久久av蜜臀妖精| 日本一区二区免费在线观看视频| 色美美综合视频| 国产精品www.| 国产成人精品一区二区三区网站观看| 亚洲影院理伦片| 久久女同互慰一区二区三区| 老牛影视一区二区三区| 欧美日韩无遮挡| 国产综合一区二区| 亚洲精品乱码久久久久久久久 | 亚洲国产裸拍裸体视频在线观看乱了 | 香蕉久久国产| 91蝌蚪porny| 久久精品国产亚洲高清剧情介绍 | 成人av电影在线网| 秋霞电影网一区二区| 中文字幕精品一区| 在线播放国产精品二区一二区四区| 在线视频一区观看| 91亚洲永久精品| 国产曰批免费观看久久久| 亚洲一区二三区| 久久精品视频免费| 欧美精品在线观看播放| 国产日韩专区| 欧美淫片网站| 国产精品一区二区久久精品爱涩| 亚洲一区二区中文在线| 欧美激情中文不卡| 精品国产一区二区三区久久影院| 色94色欧美sute亚洲线路二| 亚洲第一伊人| 欧美在线影院| 成人看片黄a免费看在线| 美女视频黄免费的久久| 亚洲一卡二卡三卡四卡| 国产欧美一区二区三区鸳鸯浴| 欧美一区二区美女| 欧洲视频一区二区| 亚洲欧美日本国产专区一区| 亚洲性图久久| 欧美日韩在线播放一区二区| 99久久免费国产| 成人午夜av电影| 国产激情视频一区二区在线观看| 看电视剧不卡顿的网站| 视频一区在线视频| 一区二区三区日韩欧美精品 | 艳妇臀荡乳欲伦亚洲一区| 国产精品美女www爽爽爽| 久久久影院官网| 欧美一级电影网站| 欧美日韩1234| 欧美综合亚洲图片综合区| 另类av一区二区| 国产日韩一区欧美| 中文精品视频| 99pao成人国产永久免费视频| 国内精品久久久久久久影视蜜臀| 色综合中文综合网| 一区二区三区在线视频免费观看| 成人欧美一区二区三区黑人麻豆 | 亚洲欧洲性图库| 国产精品久久久久久久久免费桃花| 久久久91精品国产一区二区精品| 欧美精品一区男女天堂| 欧美刺激脚交jootjob| 91精品国产91热久久久做人人| 欧美网站一区二区| 色综合久久天天| 久久亚洲色图| 色婷婷综合久久久| 91电影在线观看| 欧美色手机在线观看| 精品视频一区三区九区| 色94色欧美sute亚洲线路二 | 色综合天天综合| 欧美国产91| 欧美精品激情| 影音先锋久久| 99视频+国产日韩欧美| 国产精品嫩草99av在线| 母乳一区在线观看| 亚洲欧美日韩视频二区| 久久另类ts人妖一区二区| 色激情天天射综合网| 欧美色图在线观看| 欧美日韩久久久久久| 91精品国产综合久久精品app| 欧美一区二区三区四区高清| 精品久久国产老人久久综合| 久久久久久亚洲综合影院红桃 | 国产伦精品一区二区三区在线观看| 国产精品一级在线| www.欧美色图| 国产一区二区三区四区老人| 亚洲成人在线| 久久国产精品99国产| 欧美伊人精品成人久久综合97| 欧美视频第二页| 欧美一级二级三级蜜桃| 精品理论电影在线| 欧美国产视频在线| 亚洲精品国久久99热|