Python中變量的作用域(variable scope)


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、圖解版

variable effective domain

 

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變量了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM