直接看一段代碼: code1class Foo: code2 def spam..... code3 for code4..: code5 x()
python解釋器應(yīng)該在哪個代碼塊找到x() 的定義,? 幾種可能: 就在這個源文件定義中(廢話) 在這個class 的命名空間中 在def spam 的函數(shù)定義中 在for 循環(huán)的索引語句 中 在for 循環(huán)體中
python的變量作用域規(guī)則遵循LEGB 四個規(guī)則 Local,,局部作用域,定義在def 或lambda 方法體內(nèi)并且沒有被global 關(guān)鍵字修飾 Enclosing,,閉包作用域,,定義的def 或lambda 閉包體內(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() 的定義可能會在下面幾個地方找到 唯獨不可能出現(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,!
|