–與C語言中的變量作對比,更好的理解Python的變量。python
變量在C語言中
全局變量:其存放在內存的靜態變量區中。
局部變量:代碼塊中存放在內存的代碼區當中,當被調用後存放在內存棧區。c++
1 而Python的變量存儲,則是使用相似堆的方式管理內存,由Python內部機制統一分配回收內存。
Python做爲OOP(面向對象)編程,一直信奉着一個信條,就是萬物皆對象。
所謂對象,它能夠當作通過一系列的抽象之後,將具備共性的一類物體進行實例化(具象化)的個體,就如同咱們每一個人就是人類裏面的一個對象。編程
1 class A(): 2 name = "123" 3 def __init__(self): 4 pass 5 6 def funa(self): 7 pass 8 def funa(): 9 pass 10 11 if __name__ == "__main__": 12 Fun = funa 13 Variable = 1 14 ClassA = A() 15 ListA = [1,2,3] 16 DictA = {'d':1,'e':2} 17 TupleA = (1,2,3) 18 Str = "python" 19 print(type(Fun)) 20 print(type(Variable)) 21 print(type(ClassA)) 22 print(type(ListA)) 23 print(type(DictA)) 24 print(type(TupleA)) 25 print(type(Str))
輸出的是:
class ‘function’
class ‘int’
class ‘main.A’
class ‘list’
class ‘dict’
class ‘tuple’
class ‘str’ide
很明顯,Python中無論是基礎數據類型,類,函數,全部的一切都是做爲一個類的對象存儲在內存,也能夠單純的看作一個值。函數
而Python的變量就是做爲一個引用,讀取對象所存儲的信息,與C面向過程所不一樣,Python變量即對象的引用,通俗來講就是指向值的名稱。 spa
因此Python的變量只是不過對於一塊指定內存的引用,也即對對象的引用,或者稱爲指向值的名稱,相對於全局變量,局部變量的賦值只是引用另外一塊內存。C語言中一個變量表明一塊特定的內存,而Python不像C語言,能夠當作數據已經存放在內存之中了,被Python的變量對內存進行引用。即便變量不存在了,內存裏值也不會受到任何影響。code
1 if __name__ == "__main__": 2 3 a = 1 4 b = 2 5 print(id(a)) 6 print(id(b)) 7 8 a = b 9 print(id(a)) 10 print(id(1)) 11 print(id(2)) 12 13 sys.exit(0)
輸出的是:
10919424
10919456
10919456
10919424
10919456
從輸出結果來看,很明顯同一塊內存數據實際上是能夠被多個變量引用,且常量和變量的內存地址是相對應的。 對象
1 def funa(): 2 a = 1 3 print(id(a)) 4 5 if __name__ == "__main__": 6 7 a = 1 8 funa() 9 print(id(a)) 10 a = 2 11 print(id(a)) 12 funa() 13 14 sys.exit(0)
輸出結果是:
39697096
1409448784
39697096
1409448784
1409448784
當函數被調用完,只要類實例還被引用,那麼類實例依然存在相似c++的new,當del對象時,不影響對象還在被外部變量引用的值。
當咱們如果del掉classA後,再輸入print(id(classA)),會出現以下錯誤:blog
1 Traceback (most recent call last): 2 File "C:/Users/Administrator/PycharmProjects/pysidetest/demo.py", line 69, in <module> 3 print(id(classA)) 4 NameError: name 'classA' is not defined