日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

關于python變量的作用域問題

瀏覽:218日期: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 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜桃视频免费观看一区| 亚洲午夜在线| 在线人成日本视频| 极品裸体白嫩激情啪啪国产精品| 精品三级在线观看视频| 国产日韩欧美一区二区三区在线观看| 手机精品视频在线观看| 激情婷婷综合| 日韩欧美一区二区三区免费观看| 美女精品久久| 国产精品香蕉| 国产日韩一区二区三区在线| 日韩福利视频导航| 婷婷五月色综合香五月| 视频一区视频二区在线观看| 久久狠狠婷婷| 国产一区日韩一区| 91高清一区| 国产精品一区二区三区美女| 亚洲一二av| 国产精品美女久久久浪潮软件| 国产成人精品一区二区三区视频| 日韩动漫一区| 欧美在线不卡| 国产亚洲久久| 麻豆久久一区| 国产精品毛片一区二区在线看| 在线看片福利| 激情欧美一区| 美女91精品| 青青青国产精品| 久久精品国产免费| 久草免费在线视频| 国产传媒在线| 欧美日韩一二| 免费成人在线视频观看| 蜜臀久久99精品久久久久宅男| 日韩激情一区二区| 美女视频黄 久久| 久久影视一区| 日韩欧美中文字幕一区二区三区| 国产极品久久久久久久久波多结野| 精品一区二区三区的国产在线观看 | 亚洲深夜福利在线观看| 中文字幕视频精品一区二区三区| 亚洲精品麻豆| 精品中文字幕一区二区三区| 日韩成人综合| 夜夜精品视频| 国产精选久久| 韩国精品主播一区二区在线观看 | 日韩午夜黄色| 91成人福利| 日韩三区在线| 欧美专区一区二区三区| 日韩高清电影一区| 国产精品啊啊啊| 欧美午夜精彩| 国产日韩一区二区三区在线播放| 国产一区一一区高清不卡| 午夜在线视频观看日韩17c| 欧美久久一区二区三区| jiujiure精品视频播放| 精品国产精品国产偷麻豆 | 欧美精选视频一区二区| 日韩av资源网| 欧美高清不卡| 日韩精品一区二区三区免费观影 | 亚洲乱亚洲高清| 久久久天天操| 亚洲毛片一区| 久久福利一区| 国产欧美自拍| 日韩国产综合| 99久久激情| 麻豆国产精品| 亚洲香蕉网站| 欧美.日韩.国产.一区.二区| 黄色亚洲精品| 免费在线欧美视频| 国产精品美女久久久| 国产v综合v| 国产一区丝袜| 国产精品久久观看| 日韩极品在线观看| 国产精品igao视频网网址不卡日韩 | 中文在线а√天堂| 香蕉成人av| 狠狠爱www人成狠狠爱综合网| 免费成人性网站| 欧美私人啪啪vps| 超碰超碰人人人人精品| 先锋影音国产一区| 97精品久久| sm捆绑调教国产免费网站在线观看| 久久精品免费一区二区三区 | 日韩欧美在线精品| 欧美片网站免费| 成人在线免费观看网站| 亚洲二区精品| 日本中文字幕一区二区| 麻豆精品视频在线| 欧洲激情综合| 国产精品一区三区在线观看| 精品免费av在线| 亚洲欧美专区| 国产美女高潮在线观看| 丝袜美腿亚洲一区| 国产精品男女| 9999国产精品| 视频一区二区三区入口| 成人污污视频| 丝袜亚洲另类欧美| 国产 日韩 欧美 综合 一区| 精品99在线| 国产精品任我爽爆在线播放| 国产一区二区三区精品在线观看| 久久久9色精品国产一区二区三区| 中文字幕一区二区三区四区久久 | 亚洲天堂免费电影| 午夜在线视频观看日韩17c| 麻豆精品一区二区综合av| 91精品国产成人观看| 日韩国产一二三区| 亚洲区欧美区| 激情欧美国产欧美| 国产一区二区三区四区大秀| 伊人久久大香伊蕉在人线观看热v| 久久精品色播| 蜜桃久久久久| 久久一区欧美| 亚洲精品高潮| 久久天堂av| 超碰在线99| 青青草精品视频| 日韩一区二区在线免费| 在线一区视频| 欧产日产国产精品视频| 欧美久久精品| 久久性天堂网| 日韩精品一卡| 国产成人精品免费视| 日本a级不卡| av亚洲在线观看| 日韩免费小视频| 国产一区福利| 欧美日本不卡| 综合国产在线| 午夜精品影院| 91精品蜜臀一区二区三区在线| 美女性感视频久久| 久久国产电影| 欧美xxxx中国| 麻豆91精品视频| 欧美精品影院| 欧美日韩色图| 美女久久99| 麻豆极品一区二区三区| 国产精品115| 日韩精品看片| 国产精品**亚洲精品| 欧美大黑bbbbbbbbb在线| 日韩不卡一区二区| 亚洲欧美专区| 精品91久久久久| 欧美日韩国产高清| 狠狠久久伊人| 久久一区亚洲| 精品精品国产三级a∨在线| 久久99蜜桃| 欧美国产中文高清| 欧美成人精品午夜一区二区| 国产精品一区二区三区四区在线观看| 日韩欧美2区| 97视频热人人精品免费| 福利一区视频| 国产欧美日韩一区二区三区四区| 在线亚洲自拍| 美女精品久久| xxxxx性欧美特大| 久久一区二区三区电影| 精品一区二区三区亚洲| 精品伊人久久久| 麻豆久久一区| 另类小说一区二区三区| 精品久久免费| av一区在线| 性欧美精品高清| 亚洲天堂av资源在线观看| 鲁大师影院一区二区三区| 中文字幕亚洲在线观看| 日韩黄色在线观看| 国产精品久久久久77777丨| 免费在线亚洲欧美| 亚洲深夜视频| 91成人超碰| 青草国产精品| 成人av三级| 日韩中文字幕av电影| 国产美女视频一区二区|