Python變量的理解與內存管理

Python變量與內存管理

 –與C語言中的變量作對比,更好的理解Python的變量。python

變量

變量在C語言中 
  全局變量:其存放在內存的靜態變量區中。 
  局部變量:代碼塊中存放在內存的代碼區當中,當被調用後存放在內存棧區。c++

1 而Python的變量存儲,則是使用相似堆的方式管理內存,由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
相關文章
相關標籤/搜索