python 基礎數據類型

1,一切皆爲對象

a = 5   #a =5 在c中是非常普通的賦值,我們也通常把這個語句叫做賦值語句,但是在python中,這樣的理解就錯了。
id(a)
Out[20]: 1518791248
id(5)

Out[21]: 1518791248

#我們分別查一下他們的內存地址,發現地址是一樣的,原來python把這語句看做是對象實例化的語句。就是把一個整數對象實例化變量爲a,如果用c來寫的話,要 寫成:a= new 5()  ,很奇怪,一個類,或者對象是不可以用數字來命名的,但是可以作爲對象實例化,或者類的實例化。

2,組成: id, type, 'value'

     'value'帶引號,這裏講的是對象的組成,而不是屬性。'int' object has no attribute 'value'

3, 一切皆指針

a = 5 

#在C的角度,應該寫爲  *a = 5。並不是定義了一個變量,而是定義了一個指針。在python中,確確地說,用的是指針變量。

4,類型: int,boolean,string,list,tuple,dict

5,不可變:int ,string,tuple

         可變: list,dict

  • 不可變對象,該對象所指向的內存中的值不能被改變。當改變某個變量時候,由於其所指的值不能被改變,相當於把原來的值複製一份後再改變,這會開闢一個新的地址,變量再指向這個新的地址(原來值因爲不再有對象指向它,就會被垃圾回收。)。
  • 可變對象,該對象所指向的內存中的值可以被改變。變量(準確的說是引用)改變後,實際上是其所指的值直接發生改變,並沒有發生複製行爲,也沒有開闢新的出地址,通俗點說就是原地改變
  • 當向系統申請創建一個變量時,系統先分配一塊內存空間,該內存空間用於存儲該變量。

    變量的數據結構包括2部分:第一部分用於存儲變量的名稱和變量的數據類型的長度,第二部分用於存儲內存地址(即索引)。

    當變量未初始化時,第二部分數據爲垃圾值;一旦初始化,該部分的值即爲初始化值的內存地址。

  • 需要注意的是:tuple是不可變對象,但又和str和數值類型稍微有點區別。
add = (1, 2, 3)
aee = (1, 2, 3)
print(id(add), id(aee), id((1, 2, 3)))  # id各不相同
a = 2
b = 2
print(id(a), id(b), id(2))  # id都相同
astr = 'good'
bstr = 'good'
cstr = astr + ''
print(cstr is bstr) # True
print(id(astr), id(bstr), id('good'))  # 三個id相同
  • 平常說的tuple不可變更多時候是指裏面存放的值不能被改變(有些特殊情況,如tuple裏面存放了list,可改變list裏的元素。但實際上這個tuple並沒有被改變)。
add = (1, [2,3,4], 3)
id(add)

Out[34]: 2671383886368

add[1][2]=3
add
Out[36]: (1, [2, 3, 3], 3)

id(add)#id相同

Out[37]: 2671383886368

  • copy()與deepcopy()區別 : 淺拷貝copy()只是生成一個新的對象,數據結構以及索引關係未變。深拷貝會遞歸(逐層)拷貝list的數據結構(徹頭徹尾的另立門戶)
>>> import copy
>>> origin = [1, 2, [3, 4]]
#origin 裏邊有三個元素:1, 2,[3, 4]
>>> cop1 = copy.copy(origin)
>>> cop2 = copy.deepcopy(origin)
>>> cop1 == cop2
True
>>> cop1 is cop2
False 
#cop1 和 cop2 看上去相同,但已不再是同一個object
>>> origin[2][0] = "hey!" 
>>> origin
[1, 2, ['hey!', 4]]
>>> cop1
[1, 2, ['hey!', 4]]
>>> cop2
[1, 2, [3, 4]]
>> a = [1, 2, 3]
>>> b = a
>>> a = [4, 5, 6] //賦新的值給 a
>>> a
[4, 5, 6]
>>> b
[1, 2, 3]
# a 的值改變後,b 並沒有隨着 a 變

>>> a = [1, 2, 3]
>>> b = a
>>> a[0], a[1], a[2] = 4, 5, 6 //改變原來 list 中的元素
>>> a
[4, 5, 6]
>>> b
[4, 5, 6]
# a 的值改變後,b 隨着 a 變了
#上下兩端代碼的對比意義說明了:list是可變對象,int是不可變對象。

6,python2解釋器默認編碼類型utf-8,每個漢字三個字節,len(*)==3,decode("utf-8")轉換爲unicode。python3解釋器默認編碼類型是unicode,len(*)==1

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