久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python變量作用域規(guī)則

 yespon 2017-11-19

直接看一段代碼:

code1class Foo:     code2   def spam.....      code3      for code4..:        code5        x()

python解釋器應(yīng)該在哪個代碼塊找到x()的定義,?
幾種可能:

  1. 就在這個源文件定義中(廢話)

  2. 在這個class的命名空間中

  3. def spam的函數(shù)定義中

  4. for循環(huán)的索引語句

  5. for循環(huán)體中

python的變量作用域規(guī)則遵循LEGB四個規(guī)則  

  • Local,,局部作用域,定義在deflambda方法體內(nèi)并且沒有被global關(guān)鍵字修飾

  • Enclosing,,閉包作用域,,定義的deflambda閉包體內(nèi),作用域從內(nèi)向外擴散

  • Global(module),,全局作用域或者叫模塊作用域,,聲明在模塊文件最外層的變量,或者在函數(shù)體內(nèi)被global關(guān)鍵字修飾的變量

  • Built-in,,內(nèi)置名稱,,python內(nèi)置的變量或函數(shù),如range,、map,、SyntaxError

上面的代碼中,for語句沒有單獨的命名空間,。
按照這個規(guī)則,,x()的定義可能會在下面幾個地方找到

  • L,在def spam函數(shù)定義中(code3,、code4code5 )

  • E,,此處沒有閉包

  • G,,在code1的定義中

  • B,python內(nèi)置函數(shù)x()

唯獨不可能出現(xiàn)在code2的定義中,,可能跟你想的不太一樣,!

不要想通過函數(shù)、列表推導(dǎo),、生成器等在類定義語句塊內(nèi)訪問類變量

再來看一段代碼:

class Foo:    x = 1    l = [x for _ in range(10)]

在python3下運行這段代碼你會得到下面的錯誤:

NameError: global name 'x' is not defined

錯誤提示x沒有定義,,并且把x定性為:全局變量x。而x是在類定義語句塊初始化的并不在全局作用域內(nèi),因此找不到x的定義,,python語言標準中也有關(guān)于這個問題的詳細規(guī)定,。
深層次的原因可以參考stackoverflow上的這個回答,我自己理解的也不是很深刻就不解釋了:
https:///questions/13905741/accessing-class-variables-from-a-list-comprehension-in-the-class-definition  

最后

Happy Coding,!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多