CodeGym /Java Adesua /Python SELF TW /記憶體和數據表示

記憶體和數據表示

Python SELF TW
等級 52 , 課堂 1
開放

8.1 記憶體

記憶體 (RAM, 隨機存取記憶體) 是一個由許多記憶體單元組成的陣列,每個單元都有一個獨特的地址。這些單元可以存儲各種類型的數據,比如數字、字符和指標。當程序執行時,它將其數據和指令放置在此記憶體中以便快速訪問。

記憶體單元示例:

0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79

每個單元有其序號,也被稱為記憶體單元的地址或簡稱地址。如果你的電腦有8 GB的內存,那麼它就有80億個這樣的單元,可以用來存儲一些有用的東西。

比特與位元組

每個單元可以存儲一個位元組的信息。每個位元組由8個比特組成,每個比特只能包含0或1。示例(對於正整數):

數字 比特表示 四捨五入至位元組
0 0 00000000
1 1 00000001
100 1100100 01100100
1000 1111101000 00000011-11101000
1000 000 000 111011100110101100101000000000 00111011-10011010-11001010-00000000

變數佔用的位元組越多,能存儲的值越多。舉例說明:

  • 1個位元組— 256個唯一值
  • 2個位元組— 65千個唯一值
  • 3個位元組— 16百萬
  • 4個位元組— 40億

8.2 資料如何在記憶體中表示

數據類型及其表示

數值數據 在處理器內部和記憶體中

  • 整數:以二進制形式存儲。大小可以有所不同(1個位元組、2個位元組、4個位元組)。
  • 浮點數:以浮點格式存儲(例如,IEEE 754格式的4位元組和8位元組數字)。

x = 42  # 整數
y = 3.14  # 浮點數

重要! 在 Python 中,內建類型 intfloat 是完整的類,可以實現無限長數字的複雜計算。然而,如果你使用科學計算或人工智慧的庫,你將會遇到我上面提到的數據格式。

字符數據 在電腦記憶體中

字符和字符串在記憶體中以位元組序列的形式存儲。例如,在ASCII編碼中,每個字符佔用1個位元組,而在UTF-8編碼中,可以佔用1到4個位元組

在 Python 3.x 中,字符串默認使用UTF-8編碼,但你可以讀取以其他格式存儲文本的文件或在網絡上不以UTF-8編碼傳輸數據。

示例:


char = 'A'  # 字符
string = "Hello, world!"  # 字串

Python中的單個字符沒有自己的類型——它們也使用str類型。然而在記憶體中,這些字符串以字符為單位存儲。通常一個字符佔用1到4個位元組。

指標

指標存儲其他記憶體單元的地址。它們允許程序處理動態數據結構並更有效地管理記憶體。

示例:


list = [1, 2, 3, 4]  # 列表
list_pointer = id(list)  # 指向列表開頭的指標

8.3 在記憶體中數據表示的示例

1. 整數表示

整數以二進制數(比特)形式存儲在記憶體中。根據數據類型,它們可以佔用不同數量的位元組。例如,int通常佔用4個位元組(32位)。

這是數字42在記憶體中的表示方式:

00000000 00000000 00000000 00101010

2. 浮點數表示

浮點數(例如,float類型)以浮點格式存儲,通常是IEEE 754標準。float通常佔用4個位元組(32位),而double則佔用8個位元組(64位)。

重要!這是標準的數據類型,與記憶體和處理器綁定。Python中的float類型對應於通常的double類型,佔用8個位元組。

這是數字3.14在記憶體中的表示方式:

01000000 01001000 11110110 01100110

3. 字符和字符串表示

字符(例如,char類型)以位元組序列的形式存儲在記憶體中。字符串是字符的陣列。在 C/C++ 語言中,字符串以零位元組 (\0) 結束,但是在 Python 中不是這樣。

這是字符串Hello在記憶體中的表示方式:

'H' 'e' 'l' 'l' 'o'

這進一步將表示為0和1:

01001000 01100101 01101100 01101100 01101111

8.4 動態記憶體的地址

動態記憶體在程序執行期間根據需要分配和釋放。您在 Python 中創建的所有對象都在此記憶體中創建。

它分為兩種類型:

堆 (Heap): 用於分配動態對象的記憶體區域。通過分配函數(例如,C 中的 malloc)和釋放函數(例如,C 中的 free)來管理此記憶體。

棧 (Stack): 用於存儲本地變數和函數調用數據的記憶體區域。當進入和退出函數時,記憶體會自動分配和釋放。

再次,我無法用 Python 語言舉例說明,因為它對這些操作來說太高級了。我可以再舉一個 C 語言的例子:


// 為10個整數的陣列動態分配內存
int *dynamic_var = (int *)malloc(sizeof(int) * 10); 

// 釋放內存
free(dynamic_var);  

記憶體地址化 是為每個記憶體單元分配唯一地址的過程。每個地址指向記憶體中的特定位置,可以包含數據或指令。

地址類型

物理地址化:直接訪問記憶體單元的物理地址。由硬件(例如,記憶體控制器)管理。

虛擬地址化:使用如頁面記憶或分段記憶這樣的記憶管理機制,為進程提供隔離和保護的地址空間。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION