python值的存儲
① python是幾比特
以python3版本為例說明, int 類型在python中是動態長度的。因為python3中int類型是長整型,理論支持大的數字,但它的結構其實也很簡單, 在 longintepr.h 中定義:
struct_longobject{
PyObject_VAR_HEAD
digitob_digit[1];
};
這結構是什麼意思呢,重點在於 ob_digit 它是一個數組指針。digit 可認為是 int的別名。python的整型存儲機制是這樣的。比方要表示一個很大的數:123456789 。而每個元素只能表示3位十進制數(為理解打的比方)。那麼python就會這樣存儲:
ob_digit[0]=789
ob_digit[1]=456
ob_digit[2]=123
低位存於低索引下。python中整型結構中的數組,每個元素存儲 15 位的二進制數(不同位數操作系統有差異32位系統存15位,64位系統是30位)。
因此,sys.getsizeof(0) 數組元素為0。此時佔用24位元組(PyObject_VAR_HEAD 的大小)。 sys.getsizeof(456) 需使用一個元素,因此多了4個位元組。
② 為什麼說Python採用的是基於值的內存管理模式
先從較淺的層面來說,Python的內存管理機制可以從三個方面來講
(1)垃圾回收
(2)引用計數
(3)內存池機制
一、垃圾回收:
python不像C++,Java等語言一樣,他們可以不用事先聲明變數類型而直接對變數進行賦值。對Python語言來講,對象的類型和內存都是
在運行時確定的。這也是為什麼我們稱Python語言為動態類型的原因(這里我們把動態類型可以簡單的歸結為對變數內存地址的分配是在運行時自動判斷變數
類型並對變數進行賦值)。
二、引用計數:
Python採用了類似Windows內核對象一樣的方式來對內存進行管理。每一個對象,都維護這一個對指向該對對象的引用的計數。如圖所示(圖片來自Python核心編程)
x = 3.14
y = x
我們首先創建了一個對象3.14, 然後將這個浮點數對象的引用賦值給x,因為x是第一個引用,因此,這個浮點數對象的引用計數為1. 語句y =
x創建了一個指向同一個對象的引用別名y,我們發現,並沒有為Y創建一個新的對象,而是將Y也指向了x指向的浮點數對象,使其引用計數為2.
我們可以很容易就證明上述的觀點:
變數a 和 變數b的id一致(我們可以將id值想像為C中變數的指針).
我們援引另一個網址的圖片來說明問題:對於C語言來講,我們創建一個變數A時就會為為該變數申請一個內存空間,並將變數值
放入該空間中,當將該變數賦給另一變數B時會為B申請一個新的內存空間,並將變數值放入到B的內存空間中,這也是為什麼A和B的指針不一致的原因。如圖:
而Python的情況卻不一樣,實際上,Python的處理方式和Javascript有點類似,如圖所示,變數更像是附在對象上的標簽(和引用的
定義類似)。當變數被綁定在一個對象上的時候,該變數的引用計數就是1,(還有另外一些情況也會導致變數引用計數的增加),系統會自動維護這些標簽,並定
時掃描,當某標簽的引用計數變為0的時候,該對就會被回收。
三、內存池機制
Python的內存機制以金字塔行,-1,-2層主要有操作系統進行操作,
第0層是C中的malloc,free等內存分配和釋放函數進行操作;
第1層和第2層是內存池,有Python的介面函數PyMem_Malloc函數實現,當對象小於256K時有該層直接分配內存;
第3層是最上層,也就是我們對Python對象的直接操作;
在 C 中如果頻繁的調用 malloc 與 free 時,是會產生性能問題的.再加上頻繁的分配與釋放小塊的內存會產生內存碎片. Python 在這里主要乾的工作有:
如果請求分配的內存在1~256位元組之間就使用自己的內存管理系統,否則直接使用 malloc.
這里還是會調用 malloc 分配內存,但每次會分配一塊大小為256k的大塊內存.
經由內存池登記的內存到最後還是會回收到內存池,並不會調用 C 的 free
釋放掉.以便下次使用.對於簡單的Python對象,例如數值、字元串,元組(tuple不允許被更改)採用的是復制的方式(深拷貝?),也就是說當將另
一個變數B賦值給變數A時,雖然A和B的內存空間仍然相同,但當A的值發生變化時,會重新給A分配空間,A和B的地址變得不再相同;
而對於像字典(dict),列表(List)等,改變一個就會引起另一個的改變,也稱之為淺拷貝:
附錄:
引用計數增加
1.對象被創建:x=4
2.另外的別人被創建:y=x
3.被作為參數傳遞給函數:foo(x)
4.作為容器對象的一個元素:a=[1,x,』33』]
引用計數減少
1.一個本地引用離開了它的作用域。比如上面的foo(x)函數結束時,x指向的對象引用減1。
2.對象的別名被顯式的銷毀:del x ;或者del y
3.對象的一個別名被賦值給其他對象:x=789
4.對象從一個窗口對象中移除:myList.remove(x)
5.窗口對象本身被銷毀:del myList,或者窗口對象本身離開了作用域。
垃圾回收
1、當內存中有不再使用的部分時,垃圾收集器就會把他們清理掉。它會去檢查那些引用計數為0的對象,然後清除其在內存的空間。當然除了引用計數為0的會被清除,還有一種情況也會被垃圾收集器清掉:當兩個對象相互引用時,他們本身其他的引用已經為0了。
2、垃圾回收機制還有一個循環垃圾回收器, 確保釋放循環引用對象(a引用b, b引用a, 導致其引用計數永遠不為0)。
③ Python如何把數值放到一個數組裡面
Python把數值放到一個數組裡面的步驟如下:
1.第一步,定義一個列表a,賦值為1-9這九個數字元素,注意表示形式。
④ python中的數據類型
手機和電腦都可以跆拳道等另一個去看下都是沒關系的,我樂你可以去看下都是可以的。
⑤ python支持的數據類型
python支持的數據類型數字(number)
Python數字數據類型用於存儲數值,支持三種不同的數值類型:
1、整型(int)
亦稱整數,不帶小數點,Python3中整型不限制大小,可以當作long類型使用,所以Python3中沒有Python2中的long類型。
2、浮點型(float)
由整部分與小數部分組成,如:3.1415、-5.8,也可以用科學計數法表示,如:3.5e3,它等於:3.5e3=3.5×10^3=3500
3、復數(complex)
復數由實數部分和虛數部分構成,可以用a + bj,或者complex(a,b)表示, 復數的實部a和虛部b都是浮點型,如6.5+32j、字元串
字元串可以說是Python中最常用的數據類型,由數字、字母、下劃線等特殊符號組成的一串字元串,如我們最熟悉的'hello world!'就是一串字元串。
Python六大數據類型,快來了解一下吧
列表
列表用一對"[ ]"將單個或多個元素括起來,如['','hello',123,'acde'],每個元素之間用逗號分隔開。
Python六大數據類型,快來了解一下吧
元組
元組用一對"( )"將單個或多個元素括起來,每個元素之間用逗號分隔開。另外元組創建完畢後,元素不可修改,這點與列表大不相同。
Python六大數據類型,快來了解一下吧
字典
字典的每個鍵值對(key=>value)用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括弧{ }中 ,格式如下所示:
d ={key1 : value1, key2 : value2 }
字典是無序的,也就是說要去一個值value,必須得通過它的鍵key去取3.5e3-3.1j等。
⑥ 在Python語言中用變數m存儲100,用變數n存儲13.14輸出mn的值
枚舉:是一種基本數據類型而不是構造數據類型
枚舉可以根據Integer、Long、Short或Byte中的任意一種數據類型來創建一種新型變數。這種變數能設置為已經定義的一組之中的一個,有效地防止用戶提供無效值。該變數可使代碼更加清晰,因為它可以描述特定的值。
使得程序的可讀性和可維護性大大提高然而,很不幸,也許你習慣了其他語言中的枚舉類型,但在Python3.4以前卻並不提供。
關於要不要加人枚舉類型的問題就引起了不少討論,眾多開發者曾提出增加枚舉的建議,但被拒絕。於是人們充分利用Python的動態性這個特徵想出了枚舉的各種替代實現方式。(前輩們真的都是大神)
1.使用類屬性。
2.藉助函數
3.使用 collections.namedtuplec
Python中枚舉的替代實現方式遠不止上述這些,在此就不一一列舉了。那麼,既然枚舉在Python中有替代的實現方式。為什麼人們還要執著地提出各自建議要求語言實現枚舉呢?
顯然這些替代實現有其不合理的地方。
(1)允許枚舉值重復。
我們以collections.namedtuple為例,下面的例子中枚舉值Spring與Autumn相等,但卻不會提示任何錯誤。
(2)支持無意義的操作。
實際上2.7以後的版本還有另外一種替代選擇:使用第三方模塊flufl.enum,它包含兩種枚舉類:一種是Enum,只要保證枚舉值唯一即可,對值的類型沒限制;還有一種是IntEnum,其枚舉值為int型。
可以直接使用value屬性獲取枚舉元素的值,如:
⑦ python六大數據類型
6個數據類型:Number,String,List,Tuple,Set,Dictionary
不可變數據(3 個):Number(數字)、String(字元串)、Tuple(元組);
可變數據(3 個):List(列表)、Dictionary(字典)、Set(集合)