http://www.crifan.com/summary_python_variable_effective_scope/
解釋python中變量的作用域
示例:
1、代碼版
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 """ 4 ------------------------------------------------------------------------------- 5 Function: 6 【整理】Python中:self和init__的含義 + 為何要有self和__init__ 7 http://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them 8 9 Author: Crifan 10 Verison: 2012-11-27 11 ------------------------------------------------------------------------------- 12 """ 13 14 #注:此處全局的變量名,寫成name,只是為了演示而用 15 #實際上,好的編程風格,應該寫成gName之類的名字,以表示該變量是Global的變量 16 name = "whole global name"; 17 18 class Person: 19 name = "class global name" 20 21 def __init__(self, newPersionName): 22 #self.name = newPersionName; 23 24 #此處,沒有使用self.name 25 #而使得此處的name,實際上仍是局部變量name 26 #雖然此處賦值了,但是后面沒有被利用到,屬於被浪費了的局部變量name 27 name = newPersionName; 28 29 def sayYourName(self): 30 #此處,之所以沒有像之前一樣出現: 31 #AttributeError: Person instance has no attribute 'name' 32 #那是因為,雖然當前的實例self中,沒有在__init__中初始化對應的name變量,實例self中沒有對應的name變量 33 #但是由於實例所對應的類Person,有對應的name變量,所以也是可以正常執行代碼的 34 #對應的,此處的self.name,實際上是Person.name 35 print 'My name is %s'%(self.name); # -> class global name 36 print 'name within class Person is actually the global name: %s'%(name); #-> whole global name 37 print "only access Person's name via Person.name=%s"%(Person.name); # -> class global name 38 39 def selfAndInitDemo(): 40 persionInstance = Person("crifan"); 41 persionInstance.sayYourName(); 42 print "whole global name is %s"%(name); # -> whole global name 43 44 ############################################################################### 45 if __name__=="__main__": 46 selfAndInitDemo();
2、圖解版
3、文字版
3.1 全局變量 (Global variable)
不論是其他普通函數中,還是Class類中,都可以通過對應的變量名直接引用。
3.2 局部變量(Automatic variable)
對於函數內,包括類Class的函數內,普通的 變量 都是自動臨時變量
4、附:變量的優先級
普通局部變量和全局變量的作用域,最核心的區別在於:
內部變量的優先級大於外部變量
即(函數內的)局部變量優先級大於(外部的)全局變量
換句話說:
A、如果函數內部,出現了和全局變量同名的變量,則說明是局部變量;
B、如果函數內沒有同名的局部變量,對應的變量則是全局變量
這個變量的優先級關系不僅針對python語言,幾乎所有語言都適用,比如C/C++/C#等
所以,上面示例中的__init__中的name,不是全局變量:
name = “whole global name”;
中的name而是,局部變量;
其中,此處是屬於那種,Python(和,或其他特殊)語言所特有的,無需聲明變量,就可以直接使用的情況。
即局部變量name,並沒有聲明,但是就直接拿過來使用,通過:
name = newPersionName;
在初始化,設置為對應的名字,此處即”crifan”了。
5、類(Class)變量
類的變量,在類的范圍內,只能通過
ClassName.PropertyName (或ClassName.VariableName)去訪問當前類ClassNamer的變量PropertyName
例子中就是通過 Person.name 去訪問類Person類中的變量name
6、示例(Instance)變量
示例中的變量理論上是用InstanceObject.PropertyName去訪問的
而此處,由於Python中默認的約定俗成寫法,把類中函數的第一個參數名定義為Instance變量,且名字叫self,所以就變成了:
self.PropertyName
上述類的函數中要想訪問Instance變量就可通過 self.name去訪問Person類示例中的name變量了