天天看點

Python 資料類型:動态類型模型

Python的變量不用聲明,指派之後就可以直接使用,類型是在運作過程中自動确定的,這就是動态類型模型。該模型把變量和對象設計成兩個不同的實體,對象是存儲資料的地方,對象的類型是由初始值自動決定的,而變量僅僅是對象的引用。變量是通用的,同一個變量名可以引用任何類型的對象。

一,變量、對象和引用

動态類型模型由三部分構成:變量、對象和引用。變量的作用是引用對象,和類型沒有任何關系,類型是對象的。例如,a=3,a是變量名,Python自動建立一個記憶體對象,它的值是3,變量a自動引用對象;同時記憶體對象會存儲值的資料類型為int。

Python 資料類型:動态類型模型

1,變量

對于一個變量,當第一次給它指派時,就建立了變量,并把變量關聯到記憶體對象。之後對變量的指派,将會改變變量引用的對象。

從技術上來看,變量是指針類型,所謂的資料類型,是指變量引用的對象的類型,類型的概念存在于對象中,而不是變量中。

當變量出現在表達式中時,它會被目前引用的對象所代替,無論這個對象是什麼類型。變量是通用的,可以引用任何一個對象。

2,對象

從技術上講,對象是一塊記憶體空間,存儲頭部和内容。每個對象都有兩個标準的頭部資訊:一個類型标志符用于辨別對象的類型,一個計數器用于辨別被應用的次數。當對用被引用的次數為0時,Python會自動回收該對象占用的記憶體空間。資料類型的概念存在于對象中,而不是變量中。

3,引用

變量和對象通過引用關聯在一起,在使用變量時,Python自動通過引用擷取或設定對象的值。

4,變量使用

當變量出現在表達式中時,它會被目前引用的對象所代替,無論這個對象是什麼類型。此外,所有的變量必須在使用之前被明确的指派,使用未指派的變量會産生錯誤。

二,通用類型分類

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中,淺拷貝存在于下面三種情況:

  • 共享引用是淺拷貝,兩個變量引用同一個對象。
  • 由于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       

對于可變類型的深拷貝:

  • 清單類型有:list.copy(),list[:],list(list_var)
  • 字典類型:dict.copy()
  • copy标準庫子產品中
import copy
x=copy.deepcopy(y)      

參考文檔:

作者

:悅光陰

出處

:http://www.cnblogs.com/ljhdo/

本文版權歸作者和部落格園所有,歡迎轉載,但未經作者同意,必須保留此段聲明,且在文章頁面醒目位置顯示原文連接配接,否則保留追究法律責任的權利。