先看下面這段**,顯然無法work. 因為**試圖在testvariablescope()中引用乙個沒有被定義的變數a.所以必須報錯,如下圖-1.
不過如果你將第2行**注釋掉。**就能跑通了,如圖-2。
問題1來了:testvariablescope.a 不是也沒有被定義嗎,為什麼可以work呢?解釋如下:先看**第8行,testvariablescope.a在setvariable方法中被定義了,setvariable()又 在testvariablescope()前被呼叫。所以testvariablescope()在被呼叫的時候testvariablescope.a已經被定義了。
問題2來了:**第7行,a也被定義了。為什麼testvariablescope()在引用a是報錯呢。區別在於:a 只是setvariable()中的乙個local變數,testvariablescope當然無法引用setvariable中定義的區域性變數了。因為違反了legb原則嗎。testvariablescope.a 就不一樣了,他是乙個全域性變數哦。所以testvariablescope當然可以訪問這個全域性變數了,完全不違反legb原則。
問題3來了:為什麼testvariablescope.a是個全域性變數,而a卻不是呢。因為python中函式皆是物件,而且是全域性物件。testvariablescope.a其實就是testvariablescope這個全域性物件下的乙個變數而已,自然也是全域性變數嘍。 見圖-3
圖-1圖-2
圖-3以下關於legb, 引用自:
在 python 程式中建立、改變或查詢變數名時,都是在乙個儲存變數名的地方進行中,那個地方我們稱之為命名空間。作用域這個術語也稱之為命名空間。
具體地說,在**中變數名被賦值(python 中變數宣告即賦值,global 宣告的只是變數的使用域)的位置決定了該變數能被訪問的範圍。函式定義了本地作用域,而模組定義的是全域性作用域。這兩個作用域之前有如下關係:
如果對以上內容有所迷惑的話,請看以下總結出的幾條原則。在函式命名空間中:
C 中建構函式建立物件
1 c 中建構函式的呼叫方式主要分為兩類 1 顯示呼叫 eg stock food stock 360 250,2.5 2 隱式呼叫 eg stock food 360 250,2.5 注意 顯示呼叫建構函式大多編譯器理解為對food進行初始化,這也是最正確的理解方式,因此直道food所在的作用域到...
python類中的建立物件
python中物件導向的知識 參考部落格 知識概念和c 大體類似,但是也有一些不同的地方需要注意 如 一 python中例項化結果,建立類,例如 class a def prt self print self print self.class 例項化來建立物件 t a t.prt 二 注意在c 中建...
Python建立物件
物件導向的程式設計 將一類事物去點細枝末節的東西分為屬性 property 和方法 method 屬性 property 是靜態的,比如姓名,性別,身高,體重等等 方法 method 是動態的,比如吃飯,喝水,跳舞,運動等等 類的構造方法 類 class 的建立以關鍵字class開頭,類名首字母大寫...