python變量總結: 全局變量、局部變量、類變量、實例變量

前言:Python也同多數編程語言一樣,也有全局變量與局部變量的概念, 但是與其他編程語言又有所不同:
全局變量與局部變量兩者的本質區別就是在於作用域——
用通俗的話來理解的話,全局變量是在整個py文件中聲明,全局範圍內都可以訪問
局部變量是在某個函數中聲明的,只能在該函數中調用它,如果試圖在超出範圍的地方調用,程序就爆掉了
如果在函數內部定義與某個全局變量一樣名稱的局部變量,就可能會導致意外的效果,可能不是你期望的。因此不建議這樣使用,這樣會使得程序很不健全。

一、python變量一般有以下四種類型:

1、全局變量:在模塊內、在所有函數外面、在class外面,這就是全局變量。
2、局部變量:在函數內、在class的方法內(未加self修飾的) ,這就是局部變量
3、靜態變量:在class內的,但不在class的方法內的,這就是靜態變量
4、實例變量:在class的方法內的,用self修飾的變量,這就是實例變量

二、簡要分別介紹

1、全局變量和局部變量:

# coding:utf-8
ahead = 'HelloWorld'  # 全局變量
showList = []  # 全局變量
 
def printAhead():
    print ahead
 
def printOther():
    city = 'beijing'  # city是局部變量
    print city + ahead
 
def printList():
    global showList  # global代表引用全局變量,沒辦法,不寫的話,showList就成局部變量了
    showList.append(1)
    showList.append(2)
    print showList
 
printAhead()
printOther()
printList()
 
'''
輸出結果爲:
HelloWorld
beijingHelloWorld
[1, 2]
'''

2、靜態變量和實例變量

class Person(object):
    TAG = "Person"  # 靜態變量
 
    def __init__(self, name):   # self 當前的實例對象(簡單的說一下,其實都是引用哈)
        print "__init__", Person.TAG  # 這裏調用了靜態變量
        self.personName = name  # personName是實例變量 (簡單說就是因爲self,哈哈)
 
    def printname(self):
        group = "BeiJing_"   # group是局部變量
        print group + self.personName  # self.personName, 調用實例變量
 
if __name__ == "__main__":
    p = Person("YaoMing")
    p.printname()
    print "__main__", p.TAG
 
'''
輸出結果爲:
__init__ Person
BeiJing_YaoMing
__main__ Person
'''
三、情形舉例:

1、Global全局變量的使用

global a
def a_fun():
    a = 2
    a += 1
    print a
    # 注意這裏沒有使用return a
def do():
 	a_fun()
 	# 並把a方法的value(a)進行運算
 	a+=1   
    # 我們寫一個main函數來調用這個do的過程
if __name__ == '__main__':
 	do()
 	print a
#報錯如下:
'''
Traceback (most recent call last):
  File "/Users/a6/Downloads/PycharmProjects/AB/test_global.py", line 18, in <module>
    do()
  File "/Users/a6/Downloads/PycharmProjects/AB/test_global.py", line 15, in do
    a+=1
UnboundLocalError: local variable 'a' referenced before assignment
'''

原因:程序出現調試錯誤:local variable ‘a’ referenced before assignment,由此,我們可以看出局部變量在方法中是不能傳遞的。爲了能夠使用幾個方法返回的值,並在do()這個函數中進行運算,我們引入了全局變量global a,現在我們對以上的程序做出進行以下調整:

#-*- coding:utf-8 -*-
global a
def a_fun():
    global a   # A塊
    a = 2
    a += 1
    print "a_fun: ", a
    # 注意這裏沒有使用return a
def do():
    global a  # B塊
    a_fun()
    a+=1   
if __name__ == '__main__':
 	do()
 	print "__main__", a
 
'''
註釋A塊,會報如下錯誤:
a+=1   #UnboundLocalError: local variable 'a' referenced before assignment
NameError: global name 'a' is not defined
註釋B塊,會報如下錯誤:
 a+=1   #UnboundLocalError: local variable 'a' referenced before assignment
UnboundLocalError: local variable 'a' referenced before assignment
# 不註釋A塊和B塊,會正常運行,預期如下:
a_fun:  3
__main__ 4
Process finished with exit code 0
'''

總結:全局變量的使用是爲了使我們在一個類或一個函數中使用由函數返回的變量,並進行復雜的計算過程而使用。
而對於一個函數的局部變量,則只在一個函數內部是可使用的,而如果需要跨越不同的函數或者類則需要在基礎函數中返回一個該值,在下一個函數中運行其方法才能獲取該值進行計算;如果程序不復雜,在一個類中可以解決全局變量會爲我們節省不少的時間,以及內存空間。

2、局部變量和全局變量的用法示例:

1)試圖訪問局部變量例子

# coding:utf-8
def fun(x):
    y=2
    print "乘法的運行結果:", x*y
num1=1
print "初始num1=",num1
fun(num1)
print "y的值是:", y
 
'''
報錯:
Traceback (most recent call last):
  File "/Users/a6/Downloads/PycharmProjects/AB/test_global.py", line 8, in <module>
    print "y的值是:", y
NameError: name 'y' is not defined
原因: 因爲試圖訪問局部變量,但是訪問的地方不在該變量y的作用域中
'''

2)示例二

# coding:utf-8
def fun():
    num1=2
    print "函數內修改後num1=",num1
num1=1
print "初始num1=",num1
fun()
print "運行完函數後num1=",num1
'''
輸出結果爲:
初始num1= 1
函數內修改後num1= 2
運行完函數後num1= 1
分析:可以看到在函數內部對全局變量的修改後,在函數執行完畢,修改的結果是無效的,全局變量並不會受到影響
'''

3)引子

# coding:utf-8
def fun():
    num1*=2
    print "函數內修改後num1=",num1
num1=1
print "初始num1=",num1
fun()
print "運行完函數後num1=",num1
 
'''
輸出結果:
/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/a6/Downloads/PycharmProjects/AB/test_global.py
初始num1= 1
Traceback (most recent call last):
  File "/Users/a6/Downloads/PycharmProjects/AB/test_global.py", line 7, in <module>
    fun()
  File "/Users/a6/Downloads/PycharmProjects/AB/test_global.py", line 3, in fun
    num1*=2
UnboundLocalError: local variable 'num1' referenced before assignment
Process finished with exit code 1
原因:
報錯了。這是因爲在fun()函數使用了局部變量num1,它只是個跟全局變量同名的局部變量,使用前還是要賦值,
因此再次強調不要這樣使用
'''

3)python 2.x中的global關鍵字

# coding:utf-8
# global關鍵字
# 如果真的想要在函數體內修改全局變量的值,就要使用global關鍵字
def fun():
    global num1
    num1=2
    print "函數內修改後num1=",num1
num1=1
print "初始num1=",num1
fun()
print "運行完函數後num1=",num1
 
'''
輸出結果:
初始num1= 1
函數內修改後num1= 2
運行完函數後num1= 2
Process finished with exit code 0
分析:使用global關鍵字就是告訴python編譯器這個變量不是局部變量而是全局變量,其實有點像是"引用"的意思
'''

4)python 3.0中的nonlocal關鍵字

另一個跟變量相關的關鍵字nonlocal,字面意思就是指當前的這個變量不是局部變量。nonlocal是Python3.0中新增的關鍵字,python2.x不支持。

# coding:utf-8
# 以下程序只適合在python3.0以上執行
def fun():
    num2=3
    def fun2(): 
        #global num2   # C塊
        nonlocal num2  # D塊
        num2*=2
        print("num2=",num2)
    return fun2()
 
fun()

結果分析:
@1、不加 C塊 和 D塊 註釋塊會報如下錯誤:
UnboundLocalError: local variable ‘num2’ referenced before assignment
@2、錯誤的原因跟前面的差不多,就是使用了未定義的局部變量,
然而num2也不是全局變量,只是fun2函數的外層變量,強行使用global定義num2的話同樣會報錯(不信你試試)
這時候需要使用nonlocal關鍵字。
@3、使用 global num2 會報如下錯誤:
NameError: global name ‘num2’ is not defined
@4、使用 nonlocal num2 就正常啦:
運行結果:
num2=6
如此,程序就能正常執行

參考網址:
http://blog.csdn.net/cadi2011/article/details/52457754
http://blog.csdn.net/zmq570235977/article/details/48209851
http://blog.csdn.net/nilxin/article/details/1523898/
————————————————
版權聲明:本文爲CSDN博主「Data_IT_Farmer」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/helloxiaozhe/article/details/79139256

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章