Python的變量不用聲明,賦值以後就能夠直接使用,類型是在運行過程當中自動肯定的,這就是動態類型模型。該模型把變量和對象設計成兩個不一樣的實體,對象是存儲數據的地方,對象的類型是由初始值自動決定的,而變量僅僅是對象的引用。變量是通用的,同一個變量名能夠引用任何類型的對象。html
動態類型模型由三部分構成:變量、對象和引用。變量和類型沒有任何關係,類型是對象的,變量只是引用對象而已。例如,a=3,a是變量名,Python自動建立一個內存對象,值是3,變量a自動引用對象。緩存
1,變量函數
對於一個變量,當第一次給它賦值時,就建立了變量,並把變量關聯到內存對象。以後對變量的賦值,將會改變變量引用的對象。spa
從技術上來看,變量是指針類型,所謂的數據類型,是指變量引用的對象的類型,類型的概念存在於對象中,而不是變量中。設計
當變量出如今表達式中時,它會被當前引用的對象所代替,不管這個對象是什麼類型。指針
2,對象code
從技術上講,對象是一塊內存空間,存儲頭部和內容。每一個對象都有兩個標準的頭部信息:一個類型標誌符用於標識對象的類型,一個計數器用於標識被應用的次數。當對用被引用的次數爲0時,Python會自動回收該對象佔用的內存空間。htm
3,引用對象
變量和對象經過引用關聯在一塊兒,在使用變量時,Python自動經過引用獲取或設置對象的值。blog
Python的核心類型,一般細分爲:整數、字符串、元組、列表、字典,也能夠按照操做分爲整數、序列和映射,也能夠按照對象是否支持原處修改,把類型分爲可變類型和不可變類型。
1,按照操做分類
2,按照可變性分類
對象的可變性是指對象是否能夠原處修改,原處修改是指對象的內存空間是否能夠被修改。
Python的類型從可變性上能夠分爲兩類:可變類型和不可變類型,
可變對象能夠在原處被修改,不可變對象一旦建立成功,就保持不變。
在使用賦值符號(=)時,若是變量對變量「賦值」,產生共享引用,兩個變量引用同一個對象;若是是使用對象對變量賦值,產生的結果是建立新的對象,同時使變量引用新的對象。
例如,把變量賦值給變量時,變量之間存在共享引用,也就是說,多個變量名引用同一個對象,
a=3 b=a
此時,變量a和b同時指向一個對象。變量名賦值給變量名,使得兩個變量引用相同的對象。
當把對象賦值給變量時,並非替換了原始的對象,而是讓這個變量去引用另外一個徹底不一樣的對象。
例如,當變量從新賦值時,a='abc',變量a引用的是另外一處內存空間。此時,b是3,而a是abc。
a='abc'
1,共享引用和可原處修改
當共享引用的對象是可變類型時,對可變對象的修改,會反應到共享引用的變量上。
例如,變量l1和l2是共享引用,引用的對象是列表,而列表支持原處修改:
l1=[1,2,3] l2=l1
當修改變量l1引用的對象的值時,變量l1和l2引用的仍是同一個內存空間,l1和l2的值是相同的。
l1[0]=5
2,共享引用和相等
==和is是不一樣的「相等」比較,前者是指值相等,後者是指對象的同一性(同一個對象)。
例如,a和b既是值相等,也是對象同一的。
a=[1,2] b=a
例如,a和b是值相等,可是對象不是同一個,這說明,可變類型的常量的緩存是不可複用的。
a=[1,2] b=[1,2]
例如,x和y既是值相等,也是對象同一的,這說明,不可變類型的常量的緩存是複用的。
x=1 y=1
淺拷貝是指引用的拷貝,深拷貝是指對象的拷貝。在Python中,淺拷貝存在於下面三種狀況:
深拷貝是指值相同的不一樣對象,所以,== 運算的結果是True,而 i s運算的結果是False,例如,a和b的值相同,可是引用的對象不一樣。
a=[1,2] b=[1,2]
對a進行修改,不會引用b的值,列表的深拷貝,也能夠經過list.copy()函數來實現。
>>> a=[1,2] >>> b=a.copy() >>> a==b True >>> a is b False
對於可變類型的深拷貝:
import copy x=copy.deepcopy(y)
參考文檔:
原文出處:https://www.cnblogs.com/ljhdo/p/10104844.html